.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的方法......”。
答案 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);