一个 Set 类






4.48/5 (9投票s)
一个使用 System.Collections.Generic.Dictionary 来保存其元素的 Set 类。
引言
这个类使用 System.Collections.Generic.Dictionary
来保存元素,实现了 Set
。
使用代码
zip 文件包含三个 C# 文件
- Set.cs 包含
Set
类的定义。 - GetTypes.cs 包含获取类型数组的静态方法。
- SortMode.cs 包含
SortMode
枚举的定义。
要使用它们,只需将它们添加到您的项目中。以下部分描述了如何使用该类。
可以构建 Set 的空实例,使用
Set<int> a = new Set<int>() ;
Set<char> b = new Set<char>() ;
Set<string> c = new Set<string>() ;
您可以构建一个 Set
来包含您需要的任何类型的项(仅受底层 System.Collections.Generic.Dictionary
限制)。
Set<object> s = new Set<object>() ;
Set<int[]> s = new Set<int[]>() ;
Set<System.Data.DataRow> s = new Set<System.Data.DataRow>() ;
Set<System.EventHandler> s = new Set<System.EventHandler>() ;
Set<System.Collections.IEnumerable> s =
new Set<System.Collections.IEnumerable>() ;
可以构建并初始化 Set 的实例,使用
Set<int> s = new Set<int> ( 1 , 2 , 3 ) ;
Set<char> s = new Set<char> ( '1' , '2' , '3' ) ;
Set<string> s = new Set<string> ( "One" , "Two" , "Three" ) ;
Set<int> s = new Set<int> ( somearrayofints ) ;
Set<char> s = new Set<char> ( somearrayofchars ) ;
Set<string> s = new Set<string> ( somearrayofstrings ) ;
Set<int> s = somearrayofints ;
Set<char> s = somearrayofchars ;
Set<string> s = somearrayofstrings ;
构造函数可以接受任何类型为 object
的对象,但是转换器* 稍微受到限制,因为不允许从 object
或接口转换。
当遇到不是指定类型的项时,会检查它是否为 IEnumerable
,如果是,它将被 foreach
循环遍历。这就是上面的例子中数组的处理方式。如果遇到既不是目标类型也不是 IEnumerable
的对象**,则会抛出 InvalidOperationException
。
可以根据需要添加额外的转换器。并且我将指出,该类是 partial
的,因此您可以将任何额外的代码放在一个单独的文件中,而无需修改我的代码。
* 是的,我意识到将这些转换作为 implicit
违反了指南(因为它们可能失败),但是嘿,这是我的代码,我想怎么做就怎么做。如果您希望它们是显式的,请定义 explicit
。
** 默认情况下,Null 项被忽略。如果要为 null
抛出 NullReferenceException
,请定义 ThrowOnNull
。
一旦你构造了实例,你就可以对它们执行集合操作了
|
或 +
并集; { 1 , 2 , 3 } | { 2 , 4 , 6 } = { 1 , 2 , 3 , 4 , 6 }。
a = b | c ;
a = b + c ;
a |= b ;
a += b ;
&
交集; { 1 , 2 , 3 } & { 2 , 4 , 6 } = { 2 }。
a = b & c ;
a &= b ;
-
相对补集; { 1 , 2 , 3 } - { 2 , 4 , 6 } = { 1 , 3 }。
a = b - c ;
a -= b ;
==
等于。
if ( a == b ) { ... }
!=
不等于。
if ( a != b ) { ... }
<=
子集。
if ( a <= b ) { ... }
<
子集,但不等于。
if ( a < b ) { ... }
>=
超集。
if ( a >= b ) { ... }
>
超集,但不等于。
if ( a > b ) { ... }
以下公共方法和属性也可用
Add ( params object[] Items )
尝试将项目添加到 Set
。在某些情况下,这比使用并集运算符更有效。
s.Add ( 1 ) ;
s.Add ( 1 , 2 ... ) ;
s.Add ( somearrayofints ) ;
Remove ( params object[] Items )
尝试从 Set
中删除项目。在某些情况下,这比使用相对补集运算符更有效。
s.Remove ( 1 ) ;
s.Remove ( 1 , 2 ... ) ;
s.Remove ( somearrayofints ) ;
Contains ( params object[] Items )
如果 Set
包含项目,则返回 true
,否则返回 false
。在某些情况下,这比使用子集运算符更有效。
if ( s.Contains ( 1 ) ) { ... }
if ( s.Contains ( 1 , 2 ... ) ) { ... }
if ( s.Contains ( somearrayofints ) ) { ... }
Clear()
从 Set
中删除所有元素。
s.Clear() ;
Cardinality
是 Set
中元素的数量。
if ( s.Cardinality > 0 ) { ... }
EqualityComparer
获取/设置底层 System.Collections.Generic.Dictionary
的 EqualityComparer
。
Set<string> s = new Set<string> ( "abc" , "ABC" ) ;
System.Console.WriteLine ( s.EqualityComparer.ToString() ) ;
System.Console.WriteLine ( s.ToString() ) ;
s.EqualityComparer = System.StringComparer.CurrentCultureIgnoreCase ;
System.Console.WriteLine ( s.EqualityComparer.ToString() ) ;
System.Console.WriteLine ( s.ToString() ) ;
结果
System.Collections.Generic.GenericEqualityComparer`1[System.String]
{ abc , ABC }
System.CultureAwareComparer
{ abc }
ToString()
遍历 Set
,对每个元素执行 ToString()
,并将结果字符串按正确的 Set
格式连接在一起:{ element1 , element2... }。
System.Console.Write ( s.ToString() ) ;
ToString ( SortMode SortMode , params object[] FormatInfo )
遍历 Set
,对每个元素执行 ToString ( FormatInfo )
,并将结果字符串按正确的 Set
格式连接在一起:{ element1 , element2... }。
Set<int> s = new Set<int> ( 20 , 3 , 100 ) ;
System.Console.WriteLine ( s.ToString ( SortMode.None ) ) ;
System.Console.WriteLine ( s.ToString ( SortMode.Native ) ) ;
System.Console.WriteLine ( s.ToString ( SortMode.String ) ) ;
System.Console.WriteLine ( s.ToString ( SortMode.None , "000" ) ) ;
System.Console.WriteLine ( s.ToString ( SortMode.Native , "000" ) ) ;
System.Console.WriteLine ( s.ToString ( SortMode.String , "000" ) ) ;
结果
{ 20 , 3 , 100 }
{ 3 , 20 , 100 }
{ 100 , 20 , 3 }
{ 020 , 003 , 100 }
{ 003 , 020 , 100 }
{ 003 , 020 , 100 }
接口
IEnumerable
GetEnumerator
返回底层 System.Collections.Generic.Dictionary
的 Keys
属性的 GetEnumerator
。
foreach ( int i in s ) { ... }
历史
- 首次提交 - 2006-11-14。
- 更新于 2006-11-15。
- 添加了通过使用
Dictionary
而不是List
来指定EqualityComparer
的功能。 - 添加了为
ToString()
指定格式化信息的功能。
- 添加了通过使用