如何加速大型Linq查询的计数?

4
我有一些字节数组的列表,我使用Linq将它们组合/检查彼此。这些列表和数组的长度可以不同。问题是当我尝试计算结果时。即使我添加了.Take(1)子句,事情也没有改变。为了更好地理解,我将发布一些代码。函数Permute()会将特定数组的所有排列返回给我。
List<byte[]> firstList =new List<byte[]>();
List<byte[]> secondList=new List<byte[]>();
List<byte[]> thirdList =new List<byte[]>();

 IEnumerable<byte[]> sql = (
                            from rid in firstList
                            from s in secondList
                            from p in thirdList
                            from per in Permute(s)
                            where per.SequenceEqual(p)
                            select rid  
                           );

IEnumerable<byte[]> result = (from s in sql
                              where sql.Count(item =>item.SequenceEqual(s)) == 10
                              select s.ToArray()
                             ).Take(1);
if (result.Count() != 0)
{
  byte[] myByte=result.First();
//Do something
}

当我执行result.Count()!=0myByte=result.First()时,等待的时间可能长达一小时,即使我限制列表(第一个有十个元素,第二个有150个元素,第三个有200个元素)。 那么,是否有任何方法可以加快计数或者快速检查result中是否包含任何内容?

你为什么要写 from per in Permute(s) where per.SequenceEqual(p) - SLaks
因为我需要检查第二个列表中每个元素的每个排列。 - Anthony Stark Pirrone
但是你接下来进行过滤,只使用等于 p 的排列。这样做就失去了意义。 - SLaks
1
尝试使用Any()代替Count() != 0。 - gustavodidomenico
@SLaks 不好意思,secondList 可能会依赖于 firstList,因此我想获取所有情况,其中单个 secondList 的排列包含在 ThirdList 中。我不能使用.Contains(),因为它们是数组,所以它只会比较引用,并且因为数组{4,5}与数组{5,4}完全不同(我觉得)。 - Anthony Stark Pirrone
1个回答

4

通过调用result.FirstOrDefault()可以缩短您的时间一半,如果没有结果将返回null

这意味着您只需要迭代一次,并且不像.Count()一样从头到尾迭代整个集合。


您还可以通过编写高效的IEqualityComparer<byte[]>并调用sql.ToLookup()而不是第二个查询中的.Count()来加快查询本身的速度。


但是如果必须循环数百次,比较器会减慢搜索速度吗?(我真的不知道,我对编程相对新手) - Anthony Stark Pirrone
1
@AnthonyStarkPirrone:你已经在循环处理数百种类型了。使用比较器可以让你用哈希查找替换掉一层循环。 - SLaks

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