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
}

list(最初の10要素、2番目の150、3番目の200)を制限すると、実行result.Count()!=0してmyByte=result.First()待機時間が1時間かかる場合があります。それで、カウントを高速化する方法、またはresult「迅速な」方法で何かが含まれているかどうかを確認する方法はありますか?

4

1 に答える 1

4

を呼び出すことで時間を半分に短縮できます。結果がない場合result.FirstOrDefault()は戻ります。null

これは、1回だけ反復する必要があることを意味し、コレクション全体を反復する必要がないことを意味します(とは異なり.Count()ます) 。


2番目のクエリではなく、効率的なIEqualityComparer<byte[]>呼び出しを行うことで、クエリ自体を高速化することもできます。sql.ToLookup().Count()

于 2013-01-17T18:47:23.077 に答える