C#内联初始化IGrouping

时间:2014-03-04 18:18:07

标签: c# linq

如果我想初始化分组列表,我可以内联吗?

使用上下文进行更新

我已经知道我无法初始化接口,但是dotnet内置了一个实现吗?

我不想创建自己的实现,因为我试图将现有的私有方法重构为它自己的公共类,因此我需要传入参数进行单元测试。

void MyMethod(IList<IGrouping<int, MyObject>> objGroupings)

目前我已经使用初始化列表,然后按键分组:

var fooList = new List<MyObject>
{
     new MyObject{ foo = 5 },
     new MyObject{ foo = 5 },
     new MyObject{ foo = 5 },
     new MyObject{ foo = 2 },
     new MyObject{ foo = 2 }
};

var fooGrouping = fooList.GroupBy(o => o.foo).ToList();

3 个答案:

答案 0 :(得分:7)

IGrouping只是一个界面,无法初始化。如果要使用内联初始化,则需要初始化实现IGrouping

的对象

答案 1 :(得分:3)

我同意@David Pilkington的回答。这是我过去为此目的编写/使用的课程:

sealed class Grouping<TKey, TElement> : IGrouping<TKey, TElement>
{
    private readonly TKey m_key;
    private readonly IEnumerable<TElement> m_elements;

    public Grouping(TKey key, IEnumerable<TElement> elements)
    {
        if (elements == null)
            throw new ArgumentNullException("elements");

        m_key = key;
        m_elements = elements;
    }

    public TKey Key
    {
        get { return m_key; }
    }

    public IEnumerator<TElement> GetEnumerator()
    {
        return m_elements.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

答案 2 :(得分:-2)

您可以改为初始化词典:

var dic = new Dictionary<string, int>()
{
    { "foo", 1 },
    { "bar", 2 },
};

如果您关注具有相同键的多个值,请使用列表或值的字典(选择对您的代码更有效的列表类型)