使用lambda表达式确定一个列表是否包含另一个列表的值

4

我该如何使用lambda来判断两个列表是否具有相同的值?

    void Main()
    {
        var list1 = new List<string>{
            "a", "b", "c"
        };

        var list2 = new List<string>{
            "c", "d", "e"
        };

        bool listsHaveSameValue = false;
        foreach(var list1Value in list1){
              listsHaveSameValue = list2.Any(c => c.Equals(list1Value));
              if(listsHaveSameValue){
                   break;
              }
        }

        Debug.WriteLine(listsHaveSameValue.ToString());
    }

1
你是否正在尝试确定列表是否具有相同的值(即,相同但允许不同顺序的列表)?list2是否具有与list1相同的所有值?还是它们是否至少有一个共同项? - JLRishe
1
你需要使用lambda的动机是什么? - Myrtle
1
你当前的代码只检查了最后一个值。 - Tilak
使用lambda表达式的动机是使代码更短,无需循环另一个列表。 - anmatika
JLRishe:尝试确定它们是否至少有一个共同项。 - anmatika
显示剩余2条评论
7个回答

4
你应该了解一下Intersect
var list1 = new List<string>{ "a", "b", "c"};
var list2 = new List<string>{ "c", "d", "e"};

var doubles = list1.Intersect(list2);
bool listsHaveSameValue = doubles.Any();

实际上,没有真正需要使用lambda表达式(就像您所问的那样)。


0
Assert.IsTrue(list1.Any(x => list2.Any(y => x.YourProperty == y.YourProperty)));

这基本上与两个循环相同,只是加了一个比较的if语句。 我认为这可以实现你所要求的,但在这种情况下,我可能会使用双重循环。


0
尝试使用 Enumerable.Intersect 方法。

使用默认的相等比较器比较值,生成两个序列的交集。

public static void Main(string[] args)
        {
            var list1 = new List<string>{
            "a", "b", "c"
        };

            var list2 = new List<string>{
            "c", "d", "e"
        };

           IEnumerable<string> dubvalues = list2.Intersect(list1);

            foreach (var i in dubvalues)
            {
                Console.WriteLine(i); // Output is c
            }
        }

这里有一个演示


0

你正在有效地搜索最后一个值。

为了确定所有元素是否相同(无论列表中的顺序如何),

你应该使用

 listsHaveSameValue = listsHaveSameValue && list2.Any(c => c.Equals(list1Value));

替代

 listsHaveSameValue = list2.Any(c => c.Equals(list1Value));

判断 list1list2 是否具有相同元素的 Linq 方法之一是使用 SequenceEqual

listsHaveSameValue = list1.OrderBy(x=>x).SequenceEqual(list2.OrderBy(x=>x)

1
不,这不是问题所要求的。 - JLRishe
@JLRishe 我明白,但问题的一部分是“我如何通过lambda来做到这一点?”而且“这个”逻辑是错误的。 - Tilak
你的第一行还是没有意义。在上面的例子中,共同点恰好是list1中的最后一项,但问题并没有表明提问者只想检查最后一项是否匹配。 - JLRishe
我同意你的看法,并删除了第一行。 - Tilak

0

你应该使用Intersect

var list3 = list2.Intersect(list1);

list3 包含出现在两个列表中的元素


0

这将检查是否存在至少一个共同元素。

list1.Any(i => list2.Contains(i));

请注意,如果您拥有自己的模型类集合,则此方法不适用,只适用于基本数据类型。编译器不知道如何比较您的模型类。在这种情况下,您可以重写模型类Equals方法,从现在开始,Contains方法将使用覆盖后的Equals方法进行比较。 - dezox

0
list1.Intersect(list2).Any()

应该返回 true 或 false。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接