【问题标题】:C# Inline initialization of an IGrouping [duplicate]IGrouping的C#内联初始化[重复]
【发布时间】:2014-03-04 18:18:06
【问题描述】:

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

根据上下文更新

我已经知道我无法初始化接口,但是 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();

【问题讨论】:

标签: c# linq


【解决方案1】:

IGrouping 只是一个接口,不能初始化。如果你想使用内联初始化,你需要初始化一个实现IGrouping的对象

【讨论】:

  • 那么 dotnet 中没有内置 IGrouping 实现?
  • @EdmundYeung99 取自 stackoverflow.com/questions/8507561/… "从 .NET 4.0 开始,核心 .NET 框架中没有实现 System.Linq.IGrouping 的公共类型"
【解决方案2】:

我同意@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();
    }
}

【讨论】:

  • 那么为什么这不是 dotnet 内置的呢? Linq 库中的大多数接口都有一个实现......无论如何,谢谢
【解决方案3】:

您可以改为初始化字典:

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

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

【讨论】:

  • 这仍然没有创建List&lt;IGrouping&lt;int, object&gt;&gt;
  • 当然不是。但它在功能上是等效的(通过键访问值)。如果它用于模拟,并且您需要特定类型,我认为您必须创建实现 IGrouping 的类型(初始化程序可以与任何实现 IEnuemrable 的类型一起使用,并且具有 Add 方法)。或者,您可以创建一个简单的列表,并使用 LINQ 查询获取 IGrouping...
  • 首先,不,它不等效,因为IGrouping 不是通过键访问值的方法。它可能会以这种方式使用,但并非必须如此。见鬼,GroupBy 不会那样使用它。 ToLookup 确实如此。这里没有字典的逻辑需要。此外,字典在逻辑上不是一个键到一系列值的映射,它是一个键到单个值的映射。您的评论有两种有效的方法,但一种在问题本身中列出,另一种在另一个答案中,因此这里都没有添加任何新内容。
  • @Servy ,正如我在回答中所写的那样 如果您关心具有相同键的多个值,请使用列表或值的字典(选择对您的代码更有效的列表类型) ...抱歉没有重复我自己。 IGrouping 是一个接口。它不是一个实现 - 它只是在一个键下对值进行分组......与我在回答中所建议的相同。
  • 你这么说,但你的答案没有显示出来。事实上,您的解决方案不是该接口的实现。它需要回答这个问题。
猜你喜欢
  • 2014-03-23
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多