Linq - 如何检查列表之间的相交对象

时间:2017-03-25 12:58:23

标签: c# performance linq

我有两个对象列表。对于例如说对象就像下面的

class A
{
    int ID;
    int Value;
}

class B
{
    int ID;
    int Value;
}

我有两个上述对象列表,例如List<A> AListList<B> BList。我想查找List<B>中的任何对象是否具有与List<A>匹配的值。

目前,我喜欢的是

foreach(var item in AList)
{
    if(!BList.Any(x => x.Value == item.Value))
    {
        //Handle the error message
    }
}

Linq有没有更好的方法呢?

5 个答案:

答案 0 :(得分:1)

简单地:

from a in AList
join b in BList on a.Value equals b.Value
select a

答案 1 :(得分:1)

你可以这样做。如果BList中的任何项目在AList中具有匹配值,则会出现这种情况:

BList.Any(b => AList.Select(a => a.Value).Contains(b.Value))

答案 2 :(得分:1)

试试这个:

BList.Any(b => AList.Any(a => a.Value == b.Value));

答案 3 :(得分:1)

这是我尝试过的,似乎工作得很好:

    class First
    {
        public int Id { get; set; }
        public int Value { get; set; }
    }

    class Second
    {
        public int Id { get; set; }
        public int Value { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var firstList = new List<First>
            {
                new First { Id = 1, Value = 2 },
                new First { Id = 1, Value = 10 },
                new First { Id = 1, Value = 0 }
            };

            var secondList = new List<Second>
            {
                new Second { Id = 1, Value = 2 },
                new Second { Id = 1, Value = 2 },
                new Second { Id = 1, Value = 4 }
            };

            bool hasCommonValues = firstList.Select(f => f)
                                   .Any(u => secondList.Select(x => x.Value)
                                   .Contains(u.Value));

            Console.WriteLine(hasCommonValues);        
        }
    }

答案 4 :(得分:1)

根据您当前的代码,如果AList中的任何项目BList中没有匹配的项目时您只是需要处理错误,那么您可以这样做:

if (AList.Any(a => !BList.Any(b => b.Value == a.Value)))
{
    //Handle error
}

或者,如果您需要对AList BList中没有匹配项的每个项目采取行动:

foreach(var item in AList.Where(a => !BList.Any(b => b.Value == a.Value)))
{
    //Handle error for current `item`
}

无论如何,更喜欢LINQ而非传统foreach循环的原因通常更多是因为它的可读性(更短,更清晰,更易于维护等)而非性能。供参考:Is a LINQ statement faster than a 'foreach' loop?