1

IList <>にアイテムのリストがあります。各リストアイテムには、日付と他のいくつかのフィールドがあります。リストを日付順に並べてから、最初のアイテムの日付のみを表示するようにリストを変更し、日付が繰り返される場合は、他のアイテムの日付フィールドを実質的にnullに設定する必要があります。

例:

12/01/2012 500
12/01/2012 700
15/02/2012 900
15/02/2012 1100
27/05/2012 2000

望ましい結果:

12/01/2012 500
null       700
15/02/2012 900
null       1100
27/05/2012 2000

これは、linq groupbyおよびorderbyで可能ですか?

ありがとう

4

3 に答える 3

0

LINQ演算子は、基になるデータを変更することは想定されていません。foreachデータを変更する場合は、通常の方法を使用することをお勧めします。

これはおそらく機能するはずです:

var groups = items.GroupBy(x => x.Date).ToArray();
foreach (var group in groups)
{
    foreach (var item in group.Skip(1)) item.Date = null;
}

GroupBy順序を維持することを再確認する必要があるため、このような構造の使用は避けます。代わりに、次のようなものを使用します。

var sortedItems = items.OrderBy(x => x.Date);
var lastVisitedDate = (DateTime?) null;
foreach (var item in sortedItems)
    if (Equals(item.Date, lastVisitedDate)) item.Date = null;
    else lastVisitedDate = item.Date;
于 2012-08-29T14:38:28.943 に答える
0

これは機能するはずです:

var list = new List<DateItem>(); 
// Initialization ...
var dups = list.Select((Item,Index) => new{ Item,Index })
               .GroupBy(x => x.Item.Date)
               .Where(g => g.Count() > 1);
foreach(var dup in dups)
{
    foreach (var nullable in dup.OrderBy(x => x.Item.Date).Skip(1))
    {
        list[nullable.Index].Date = null; 
    }
}

クラスが次のようになっていると仮定します。

class DateItem {
    public DateTime? Date;
    public int OtherField;
}

編集:これが実用的なデモです:http://ideone.com/cVL4G

于 2012-08-29T14:38:32.360 に答える
0

1つの方法は、LINQを使用してすべてのフォロワーを取得し、ループ内でそれらの日付をnullに設定することです。

// Use ToList() to make sortedItems non-lazy so it won't get ordered each time it's called.
var sortedItems = items.OrderBy(x => x.Date).ToList();
var followers = sortedItems.GroupBy(item => item.Date)
                           .SelectMany(group => group.Skip(1));  
foreach (var follower in followers)
{
    follower.Date = null;
}
// Now you can use sortedItems.

または、クエリ構文が必要な場合:

var followers = from item in sortedItems
                group item by item.Date into grp
                from follower in grp.Skip(1)
                select follower;           
于 2012-08-29T15:59:29.467 に答える