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();

但是,如果您关心日期,则可以采用两种方法。您最终可能会丢弃对 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 将返回的一级集合,即

any IEnumerable<IEnumerable<T>> becomes an IEnumerable<T>.
于 2013-08-27T15:03:59.113 回答
-2

我会做一些稍微不同的事情,我会将它们发送到您自己的列表中:

var results;

private method(Date date)
{

     resuts = evt.eventData.Where(a=> a.Date == date).toList();

}
于 2013-08-27T14:51:27.737 回答