3

プロジェクトでTroyGoodeのページリストを使用しています。
通常は、IEnumerable、startindex、およびitem countをフィードするだけで、すべて機能します。
ただし、次のように生成したIEnumerableをフィードしようとしています。

private static IEnumerable<Color> GetColors(Query query)
{
    IndexSearcher searcher = new IndexSearcher(luceneIndexpath);
    Hits hitColl = searcher.Search(query);
    //Get all the unique colorId's
    List<int> ids = new List<int>();            
    int id = 0;
    for (int i = 0; i < hitColl.Length(); i++)
    {
        if (Int32.TryParse(hitColl.Doc(i).GetField("id").StringValue(), out id))
            ids.Add(id);                
    }
    foreach (int uniqueId in ids.Distinct<int>())
    {
        yield return ColorService.GetColor(uniqueId);
    }
}

--EDIT-- pagedListは機能しますが、ページングされたオブジェクトだけでなく、すべてのMyColorオブジェクトのyieldを要求します。このコース外では、PagedListの使用全​​体が無効になり、大量の列挙が発生する可能性があります。

--EDIT--
必要だと思うのは、Count()を実装して、ColorService.GetColor()を使用してすべてのオブジェクトを作成し、そのリストをカウントする代わりに、ids.Distinct(int)からカウントを返すようにする方法です。 。

4

2 に答える 2

4

1) PagedList は、データを見て少なくとも 2 回繰り返し処理します。これにより問題が発生しないことを確認してください。または、リストまたはその他の「安価な」バッファーにキャッシュして、2回クエリする必要がないようにすることを検討してください。

ToList()2)生成された結果をページ リストに渡す前に呼び出した場合、正しいように見えますか?

3)GetColors()メソッドを使用して、生成されたものをすべてダンプした場合、それは正しいよう見えますか?

基本的に、問題が GetColors にあるのか、PagedList にあるのか、それともこの 2 つの相互作用にあるのかを突き止める必要があります。

編集: Count() を「ショートカット」する唯一の方法は、IListorを実装することIList<T>です。ただし、その時点で、適切に行うか、オーバーライドして再度実装する必要があります。メモリに保持したくない大規模なリストが実際にない限り、結果を呼び出して使用する方がはるかに高速になる可能性が高いと思います。CountIEnumerableToList()

于 2009-02-16T11:45:08.270 に答える
0

受け入れるように見えるので、あなたIQueryable<T>に電話するだけでうまくいくはずです。ただし、個人的には、ページを取得するために使用するだけです。ページサイズ10に基づくページ3も同様です。これを拡張メソッドに簡単にラップできます。.AsQueryable()IEnumerable<T>.Skip().Take()[your enumerable].Skip(20).Take(10)

public static IEnumerable<T> GetPage<T>(
    this IEnumerable<T> source,
    int pageIndex, int pageSize)
{
    return source.Skip(pageIndex * pageSize).Take(pageSize);
}

それならそれは[your enumerable].GetPage(3, 10)

于 2009-02-16T11:41:35.330 に答える