当键选择器应 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);