2

これが私のクラス構造の簡略化されたバージョンです:

public class TransferObject
{
    public List<Event> events { get; set; }

    public TransferObject()
    {
        events = new List<Event>();
    }
}

public class Event
{
    public List<Data> eventData { get; set; }

    public Event()
    {
        eventData = new List<Data>();
    }
}

public class Data
{
    public int someData {get; set;}
    public DateTime date { get; set; }
}

私がやりたいことは、リスト内のすべてのDataオブジェクトを取得し、eventDataそれらを によってグループ化されたリストの新しいグループ化リストに入れることdateです。

すべてのDataオブジェクトを一時リストに入れ、そのリストをLinqでグループ化することを考えましたが、一時リストを使用せずにそれを行うよりエレガントな方法があるかどうか知りたい.

4

3 に答える 3

9

あなたが何を望んでいるのか理解できれば、次のようなことがうまくいくはずです:

var results = 
    from e in transferObject.events
    from d in e.eventData
    group d by d.date;

または流暢な構文で:

var results = transferObject.events
    .SelectMany(e => e.eventData)
    .GroupBy(d => d.date);
于 2013-08-27T14:47:12.317 に答える
4

まあ、それはあなたが探しているデータに依存します。実際の Date 値を気にしない場合は、整数がそれらによってグループ化されている (そして、それらによってソートされていると思われる) だけで、Event クラスへの参照から次のようになります。

List<List<int>> byDate = evt.eventData
    .GroupBy(d => d.date)
    .OrderBy(g=>g.Key)
    .Select(g => g.Select(v => v.someData)
        .ToList())
    .ToList();

ただし、日付が気になる場合は、2 つの方法があります。Data クラスへの参照を破棄してしまう可能性があります。

Dictionary<DateTime, List<int>> byDate2 = evt.eventData
    .GroupBy(d => d.date)
    .OrderBy(g=>g.Key)
    .ToDictionary(
        g=>g.Key, 
        g => g.Select(v => v.someData)
            .ToList());

または、Data オブジェクトを保持することもできます。

List<List<Data>> byDate = evt.eventData
    .GroupBy(d => d.date)
    .OrderBy(g => g.Key)
    .Select(g => g.ToList())
    .ToList();

しかし、TransferObject クラスへの参照からこれを実行したいとします。次に、ほとんど同じことを行いますが、SelectMany 関数を使用する必要があります。

TransferObject txobj = new TransferObject(); // however this happens
List<List<int>> byDate = txobj.events
    .SelectMany(evt=>evt.eventData
        .GroupBy(d => d.date)
        .OrderBy(g => g.Key)
        .Select(g => g.Select(v => v.someData)
            .ToList()))
    .ToList();

Dictionary<DateTime, List<int>> byDate2 = txobj.events
    .SelectMany(e=>e.eventData)
    .GroupBy(d => d.date)
    .OrderBy(g=>g.Key)
    .ToDictionary(
        g=>g.Key, 
        g => g.Select(v => v.someData)
            .ToList());

List<List<Data>> byDate3 = txobj.events
    .SelectMany(evt=>evt.eventData
        .GroupBy(d => d.date)
        .OrderBy(g => g.Key)
        .Select(g => g.ToList()))
    .ToList();

ここで重要なのは、SelectMany 関数は基本的に、通常の Select が返す 1 つのレベルのコレクションを連結するということです。

any IEnumerable<IEnumerable<T>> becomes an IEnumerable<T>.
于 2013-08-27T15:03:59.113 に答える