以下是我的类结构的简化版本:
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对该列表进行分组,但我想知道是否有更优雅的方法可以不使用临时列表。
答案 0 :(得分:6)
如果我明白你想要什么,这样的事情应该有效:
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);
答案 1 :(得分: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());
或者您可以保留数据对象:
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>.
答案 2 :(得分:-2)
我会做一些稍微不同的事情,我会将它们发送到您自己的列表中:
var results;
private method(Date date)
{
resuts = evt.eventData.Where(a=> a.Date == date).toList();
}