2

我有两个 HashSet——setA 和 setB。

  1. 我们如何找到 setA 和 setB 的补集?
  2. 交叉点的代码是找到交叉点的最佳方法吗?

代码

 string stringA = "A,B,A,A";
 string stringB = "C,A,B,D";

 HashSet<string> setA = new HashSet<string>(stringA.Split(',').Select(t => t.Trim()));
 HashSet<string> setB = new HashSet<string>(stringB.Split(',').Select(t => t.Trim()));

 //Intersection - Present in A and B
 HashSet<string> intersectedSet = new HashSet<string>( setA.Intersect(setB));

 //Complemenet - Present in A; but not present in B

更新

用于OrdianlIgnoreCase忽略大小写敏感性 如何在不区分大小写模式下使用 HashSet<string>.Contains() 方法?

参考

  1. HashSet<T> 和 List<T> 有什么区别?
  2. 多个列表与 IEnumerable.Intersect() 的交集
  3. 比较两个哈希集
  4. 比较两个哈希集?
  5. 在 C# 中查找两个集合的补集的最快方法
4

2 回答 2

2

1 - 我们如何找到 setA 和 setB 的补集?

采用HashSet<T>.Except Method

//Complemenet - Present in A; but not present in B
HashSet<string> ComplemenetSet = new HashSet<string>(setA.Except(setB));

尝试使用以下字符串。

string stringA = "A,B,A,E";
string stringB = "C,A,B,D";

ComplementSet 将包含E

2 - 交叉路口的代码是找到交叉路口的最佳方法吗?

可能是

于 2012-11-30T09:32:23.627 回答
2

您可以使用Except获得 A 或 B 的补码。要获得对称补码,请使用SymmetricExceptWith.

setA.SymmetricExceptWith(setB);

请注意,这会修改 setA. 要获得交集,有两种方法:Intersect,它创建一个新的HashSet,和IntersectWith,它修改第一个:

// setA and setB unchanged
HashSet<string> intersection = setA.Intersect(setB);

// setA gets modified and holds the result
setA.IntersectWith(setB);
于 2012-11-30T09:33:51.347 回答