在另一个列表中搜索列表值

时间:2019-01-18 20:28:11

标签: c#

我正在尝试使用其他列表值对列表进行搜索。

例如,我的列表A带有一组特定的值(1,2,3,4,5)。我还有另一个值(6,7,8,9,0)的列表(列表B)

我有第三个列表(列表C),其中包含一组值(1、3、4)

我希望我的代码能够使用列表C的值来基于列表中的所有值返回匹配列表。

换句话说,代码将返回列表A,因为值1、3和4都包含在该列表中。

如果列表C包含1,3,4和7,则不会返回任何列表

我不确定如何做到这一点。

3 个答案:

答案 0 :(得分:2)

您可以使用LINQ的Intersect方法来查找a(或b)和c之间共享的元素,然后确保计数相同。 / p>

if (a.Intersect(c).Count() == c.Count())
    Console.WriteLine("Everything in c is in a.")

答案 1 :(得分:1)

如果数字和重复项的顺序不重要,则此代码将起作用:

melt

答案 2 :(得分:1)

...基于所有值的匹配列表。...

有一个IEnumerable可以完全满足您的要求
Enumerable.All

bool allForA = listC.All(c => listA.Contains(c));
if(allForA)
   return listA;
....

而且,我不确定,但是在性能方面可能也是更好的选择,因为我认为如果找不到元素,则枚举将停止并返回false,而无需枚举列表的所有元素

编辑:出于好奇,我已经针对“相交”方法测试了“全部”方法,现在我可以确认“全部”速度比“相交”至少快三倍。 (我当然是在说一百万次循环的毫秒数,因此几乎不用担心,但我很好奇)

这是在LinqPad中运行的示例(如果出现问题,请告诉我)

void Main()
{
    List<int> listA = new List<int> {1,2,3,4,5};
    List<int> listB = new List<int> {6,7,8,9,0};
    List<int> listC = new List<int> {1,3,4};

    int z = 0;
    Stopwatch sw = new Stopwatch();
    sw.Start();
    for(int x = 0; x < 1000000; x++)
        if (listB.Intersect(listC).Count() == listC.Count())
            z++;
    sw.Stop();
    sw.ElapsedMilliseconds.Dump("INTERSECT => B");

    z = 0;
    sw = new Stopwatch();
    sw.Start();
    for (int x = 0; x < 1000000; x++)
        if(listC.All(c => listB.Contains(c)))
            z++;
    sw.Stop();
    sw.ElapsedMilliseconds.Dump("ALL => B");

    sw.Start();
    for (int x = 0; x < 1000000; x++)
        if (listA.Intersect(listC).Count() == listC.Count())
            z++;
    sw.Stop();
    sw.ElapsedMilliseconds.Dump("INTERSECT => A");

    z = 0;
    sw = new Stopwatch();
    sw.Start();
    for (int x = 0; x < 1000000; x++)
        if (listC.All(c => listA.Contains(c)))
            z++;
    sw.Stop();
    sw.ElapsedMilliseconds.Dump("ALL => A");

}