65.9K
CodeProject 正在变化。 阅读更多。
Home

一个 Set 类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.48/5 (9投票s)

2006年11月20日

CPOL

3分钟阅读

viewsIcon

68357

downloadIcon

363

一个使用 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() ;

CardinalitySet 中元素的数量。

if ( s.Cardinality > 0 ) { ... }

EqualityComparer 获取/设置底层 System.Collections.Generic.DictionaryEqualityComparer

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.DictionaryKeys 属性的 GetEnumerator

foreach ( int i in s ) { ... }

历史

  • 首次提交 - 2006-11-14。
  • 更新于 2006-11-15。
    • 添加了通过使用 Dictionary 而不是 List 来指定 EqualityComparer 的功能。
    • 添加了为 ToString() 指定格式化信息的功能。
© . All rights reserved.