2

null 値が最初の非 null 値の後、最後の非 null 値の前に表示される場合にのみ、リストから null 値を除外する必要があるという要件があります。

Product one = new Product { Name="A" Priority="1" Value=null };
Product two = new Product { Name="A" Priority="2" Value=null };
Product three = new Product { Name="A" Priority="3" Value="10" };
Product four = new Product { Name="A" Priority="4" Value=null };
Product five = new Product { Name="A" Priority="5" Value="20" };
Product six = new Product { Name="A" Priority="6" Value=null };

この例では、最初に製品のリストを優先度に基づいて並べ替え、次に最初の非 null 値 (優先度 3) と最後の非 null 値 (つまり優先度 5) をチェックして、リストを取得する必要があります。プライオリティ 3 および 5 内の null 値を持つすべての製品の。したがって、この例では、プライオリティ 4 の製品 4 のみが探しているレコードです。実際に商品ごとにグルーピングして優先度順に並べる部分までは行きましたが、その後の進め方にこだわりました

from p in Products
group p by p.Product into grp
select new
{
   Product = grp.Key
   Values = grp.OrderBy(x => x.Priority)
}

誰かが先に進む方法を教えてもらえますか? インデックスを使用してすべての非 null を識別し、反復して最小および最大優先度値を取得し、後で最小/最大優先度内の空白の null 値を持つすべてのレコードをクエリすることを考えています。

4

2 に答える 2

2

グループ内の開始点と終了点を決定し、そこからフィルタリングすると、より簡単で効率的になります。

var query =
    from product in Products
    group product by product.Name into g
    let ordered = g.OrderBy(p => p.Priority).ToList()
    let firstIndex = ordered.FindIndex(p => p.Value != null)
    let lastIndex = ordered.FindLastIndex(p => p.Value != null)
    select new
    {
        Product = g.Key,
        Values = ordered
            .Skip(firstIndex + 1)
            .Take(lastIndex - firstIndex - 1)
            .Where(p => p.Value == null),
    };
于 2012-07-25T19:06:08.383 に答える
1

これはどうですか (製品ごとに個別のグループを取得 する.Select代わりに使用できます。すべての有効な結果レコードを 1 つのリストに結合します):.SelectMany.SelectMany

Products
    .GroupBy(p => p.Name)
    .SelectMany (grp =>
        grp.OrderBy(p => p.Priority)           // sort by priority
            .SkipWhile(p => p.Value == null)   // skip null entries at beginning
            .Reverse()                         // reverse
            .SkipWhile(p => p.Value == null)   // skip null entries at end
            .Reverse()                         // reverse back to normal
            .Where(p => p.Value == null)       // then find null entries
    );

デモ: http://ideone.com/2dU9L

于 2012-07-25T18:10:36.603 に答える