如何比较两个List <string>并返回不匹配(c#)

时间:2017-08-23 20:48:15

标签: c# string list

.net小提琴:https://dotnetfiddle.net/27wJLc

我有两个字符串列表,'all'列表和要比较的列表,然后我想从'All'列表中返回不匹配的字符串:

public static void Main()
{
    List<string> ratiodGids = new List<string>();
    List<string> allGids = new List<string>();
    List<string> notRatiodGids = new List<string>();

    allGids.Add("tom"); 
    allGids.Add("bob"); 
    allGids.Add("bill");    
    allGids.Add("tim"); 
    allGids.Add("sam"); 

    ratiodGids.Add("tom");  
    ratiodGids.Add("tim");  
    ratiodGids.Add("sam");  

    foreach(var g in ratiodGids)
    {
        if(!allGids.Contains(g))
        {
           notRatiodGids.Add(g);
        }
    }

    Console.WriteLine(notRatiodGids.Count);

    foreach(var i in notRatiodGids)     
        Console.WriteLine(i);
}

我很确定我可以将所有内容重新输入IEnumerable然后使用Intersect或Except,但这需要一些工作。所以我想在这之前看看是否可以使用列表。

使用我的代码,列表不返回任何内容。如果我删除'!'我回来了汤姆,蒂姆,山姆。所以它有一种方式,但不是另一种方式。

更新:我想要的结果只是来自ratiodGids的字符串,这些字符串在allGids中不存在。订单无关紧要。另外,我尝试过使用Exists(),Except(),Any(),Where(),它们都给我“List不包含一个叫做blah的方法......”。

5 个答案:

答案 0 :(得分:4)

您可以比较两个列表并返回一个仅包含如下差异的新列表:

List<string> difference = list1.Except(list2).ToList();

答案 1 :(得分:4)

嗯,您也可以在Except()上使用List,因为它实现了IEnumerable的{​​{3}}。

更新

正如评论中所指出的,Linq方法是IEnumerable上的扩展方法。要使用它们,您必须通过添加:using System.Linq;

来添加其命名空间

答案 2 :(得分:1)

你可以这样做:

var results = allGids.Where( a=> !ratiodGids.Contains(a))

如果你想从两个列表中获得uniqe项目,那么:

var results = allGids.Where( a=> !ratiodGids.Contains(a))
    .Union(ratiodGids.Where( a=> !allGids.Contains(a)));

答案 3 :(得分:1)

更改此

    foreach(var g in ratiodGids)
{
    if(!allGids.Contains(g))
    {
       notRatiodGids.Add(g);
    }
}

到这个

    foreach(var g in allGids)
{
    if(!ratioGids.Contains(g))
    {
       notRatiodGids.Add(g);
    }
}

答案 4 :(得分:0)

要明确的是,如果listA = {A,B,C}且listB = {B,C,D},您希望您的结果是{A,D}吗?如果是这样,这是一种方式:

var union = listA.Union(listB);
var intersection = listA.Intersect(listB);
var outside = union.Except(intersection);