我正在尝试比较两个列表,并在每个列表中仅保留每个列表唯一的项目。你能帮忙吗?
我知道怎么做交集,但实际上我需要做相反的事情
//Example
List<String> baseListCopy = new List<String>();
baseListCopy.Add("Test1");
baseListCopy.Add("Test2");
baseListCopy.Add("Test3");
baseListCopy.Add("Test4");
baseListCopy.Add("Test5");
baseListCopy.Add("Test6");
baseListCopy.Add("Test7");
baseListCopy.Add("Test8");
baseListCopy.Add("Test9");
List<String> resultListCopy = new List<String>();
resultListCopy.Add("Test1");
resultListCopy.Add("Test2");
resultListCopy.Add("Test3");
resultListCopy.Add("Test40");
resultListCopy.Add("Test90");
//returns only items that are present on both lists
resultListCopy = baseListCopy.Intersect(resultListCopy, StringComparer.InvariantCultureIgnoreCase).ToList();
//How do I return only items that are unique to that list?
答案 0 :(得分:7)
你的问题不清楚。
听起来您希望所有项目都出现在一个列表中(XOR):
a.Union(b).Except(a.Intersect(b))
答案 1 :(得分:3)
目前尚不清楚“列表”的含义,但我认为您需要Except
:
// Just to avoid scrolling :)
var comparer = StringComparer.InvariantCultureIgnoreCase;
var baseListOnly = baseListCopy.Except(resultListCopy, comparer)
.ToList();
请注意,您可以使用集合初始值设定项轻松填充列表:
List<String> baseListCopy = new List<String> {
"Test1", "Test2", "Test3",
"Test4", ...
};
如果您在实际之后只有一个列表中的项目,那么SLaks回答的另一种替代方法是使用HashSet<T>.SymmetricExceptWith
:
var hashSet = new HashSet<string>(baseListCopy,
StringComparer.InvariantCultureIgnoreCase);
// This mutates the set
hashSet.SymmetricExceptWith(resultListCopy);
答案 2 :(得分:2)
要获取resultListCopy
resultListCopy = baseListCopy.Except(resultListCopy, StringComparer.InvariantCultureIgnoreCase)
.ToList();
答案 3 :(得分:1)
为什么不取交点并迭代它,从交集中的基数中删除每个值。尝试:
resultListCopy = baseListCopy.Intersect(resultListCopy, StringComparer.InvariantCultureIgnoreCase).ToList();
resultList = new List<String>();
foreach (string s in resultListCopy )
{
if (!baseListCopy.contains(s))
resultList.add(s);
}
或者使用resultListCopy和基础列表交换,如果这是你的意思。
答案 4 :(得分:1)
SLaks的帖子略有变化:
var finalListCopy =
baseListCopy.Except(resultListCopy).Union(resultListCopy.Except(baseListCopy));
两个例外加入了联盟...:D