如何检查列表A包含列表B中的任何值?

wah*_*aha 47 c# linq list

清单A:

1, 2, 3, 4
Run Code Online (Sandbox Code Playgroud)

清单B:

2, 5
Run Code Online (Sandbox Code Playgroud)

如何检查列表A是否包含列表B中的任何值?

例如A.contains(a => a.id = B.id)?

Jus*_*ner 92

如果您不关心性能,可以尝试:

a.Any(item => b.Contains(item))
// or, as in the column using a method group
a.Any(b.Contains)
Run Code Online (Sandbox Code Playgroud)

但我先试试这个:

a.Intersect(b).Any()
Run Code Online (Sandbox Code Playgroud)


rad*_*byx 24

我已经介绍了Justins的两个解决方案.a.Any(a => b.Contains(a))是最快的.

using System;
using System.Collections.Generic;
using System.Linq;

namespace AnswersOnSO
{
    public class Class1
    {
        public static void Main(string []args)
        {
//            How to check if list A contains any value from list B?
//            e.g. something like A.contains(a=>a.id = B.id)?
            var a = new List<int> {1,2,3,4};
            var b = new List<int> {2,5};
            var times = 10000000;

            DateTime dtAny = DateTime.Now;
            for (var i = 0; i < times; i++)
            {
                var aContainsBElements = a.Any(b.Contains);
            }
            var timeAny = (DateTime.Now - dtAny).TotalSeconds;

            DateTime dtIntersect = DateTime.Now;
            for (var i = 0; i < times; i++)
            {
                var aContainsBElements = a.Intersect(b).Any();
            }
            var timeIntersect = (DateTime.Now - dtIntersect).TotalSeconds;

            // timeAny: 1.1470656 secs
            // timeIn.: 3.1431798 secs
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


D S*_*ley 13

你可以Intersect这两个清单:

if (A.Intersect(B).Any())
Run Code Online (Sandbox Code Playgroud)


小智 9

要获得更快、更短的解决方案,您可以使用HashSet代替List.

a.Overlaps(b);
Run Code Online (Sandbox Code Playgroud)

重叠文档

此方法是 O(n) 而不是具有两个列表的 O(n^2)。


小智 5

您可以使用此检查列表是否在另一个列表中

var list1 = new List<int> { 1, 2, 3, 4, 6 };
var list2 = new List<int> { 2, 3 };
bool a = list1.Any(c => list2.Contains(c));
Run Code Online (Sandbox Code Playgroud)