比较两个List <string>的简单方法,只保留唯一值</string>

时间:2012-03-14 21:14:02

标签: c# list data-structures

我正在尝试比较两个列表,并在每个列表中仅保留每个列表唯一的项目。你能帮忙吗?

我知道怎么做交集,但实际上我需要做相反的事情

        //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?

5 个答案:

答案 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