当键选择器应 return 一组键时,在 C# 中加入 IEnumerable
Join an IEnumerable in C# when the key selector shall return a set of keys
我有一个名为 Meeting
的数据容器
public struct Meeting
{
public string Id { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
}
这个很简单。它有一个 Id 和两个日期时间,分别标记会议开始时间和会议结束时间。
我需要 return Lookup
为每一天映射当天安排的所有会议。
我已经实现了这个 IEnumerable 扩展:
public static IEnumerable<ILookup<D, T>> GroupBy<T, D> (this IEnumerable<T> outer,
Func<T, IEnumerable<D>> func)
{
if (outer == null)
throw new ArgumentNullException(nameof(outer));
if (func == null)
throw new ArgumentNullException(nameof(func));
Dictionary<D, IEnumerable<T>> lookup = new Dictionary<D, IEnumerable<T>>();
foreach(T item in outer)
{
IEnumerable<D> keySelectory = func(item);
if (keySelectory != null)
{
foreach(D newKey in keySelectory)
{
if (!lookup.ContainsKey(newKey))
{
lookup.Add(newKey, new List<T>() { item });
}
else
{
List<T> temp = lookup[newKey].ToList();
temp.Add(item);
lookup[newKey] = temp;
}
}
}
}
return WHAT?
}
最后我迷路了,因为 Lookup 构造函数是私有的,所以我无法实例化它。
因为我想这样称呼:
meetings.GroupBy(meeting => GetDatesFromStartAndEndTimes(meeting));
其中 GetDatesFromStartAndEndTimes 方法很简单。
谁能告诉我如何进行?谢谢。
如果您只是想知道如何创建查找,可以使用 LINQ ToLookup 扩展方法:
var meetingsByDate = meetings
.SelectMany(meeting => GetDatesFromStartAndEndTimes(meeting),
(meeting, date) => new{meeting, date})
.ToLookup(pair => pair.date, pair.meeting);
我有一个名为 Meeting
public struct Meeting
{
public string Id { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
}
这个很简单。它有一个 Id 和两个日期时间,分别标记会议开始时间和会议结束时间。
我需要 return Lookup
为每一天映射当天安排的所有会议。
我已经实现了这个 IEnumerable 扩展:
public static IEnumerable<ILookup<D, T>> GroupBy<T, D> (this IEnumerable<T> outer,
Func<T, IEnumerable<D>> func)
{
if (outer == null)
throw new ArgumentNullException(nameof(outer));
if (func == null)
throw new ArgumentNullException(nameof(func));
Dictionary<D, IEnumerable<T>> lookup = new Dictionary<D, IEnumerable<T>>();
foreach(T item in outer)
{
IEnumerable<D> keySelectory = func(item);
if (keySelectory != null)
{
foreach(D newKey in keySelectory)
{
if (!lookup.ContainsKey(newKey))
{
lookup.Add(newKey, new List<T>() { item });
}
else
{
List<T> temp = lookup[newKey].ToList();
temp.Add(item);
lookup[newKey] = temp;
}
}
}
}
return WHAT?
}
最后我迷路了,因为 Lookup 构造函数是私有的,所以我无法实例化它。
因为我想这样称呼:
meetings.GroupBy(meeting => GetDatesFromStartAndEndTimes(meeting));
其中 GetDatesFromStartAndEndTimes 方法很简单。 谁能告诉我如何进行?谢谢。
如果您只是想知道如何创建查找,可以使用 LINQ ToLookup 扩展方法:
var meetingsByDate = meetings
.SelectMany(meeting => GetDatesFromStartAndEndTimes(meeting),
(meeting, date) => new{meeting, date})
.ToLookup(pair => pair.date, pair.meeting);