我有一些字节数组列表,我用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()!=0
和myByte=result.First()
时,等待时间可能需要一个小时,如果我限制列表(前10个元素,第二个150个元素和第三个200个元素)。那么,是否有任何方法可以加速计数或检查result
是否以"快速"的方式包含某些内容?
您可以通过调用result.FirstOrDefault()
来节省一半的时间,如果没有结果,它将返回null
。
这意味着你只需要迭代一次,这意味着你永远不需要迭代整个集合(不像.Count()
)
您还可以通过编写一个高效的IEqualityComparer<byte[]>
并在第二个查询中调用sql.ToLookup()
而不是.Count()
来使查询本身更快。