我正在尝试使用其他列表值对列表进行搜索。
例如,我的列表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,则不会返回任何列表
我不确定如何做到这一点。
答案 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");
}