Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#i组的内联初始化_C#_Linq - Fatal编程技术网

C#i组的内联初始化

C#i组的内联初始化,c#,linq,C#,Linq,如果我想初始化分组列表,我可以内联执行吗 使用上下文更新 我已经知道我无法初始化接口,但是dotnet中是否已经内置了实现 我不想创建自己的实现,因为我正试图将现有的私有方法重构为它自己的公共类,因此我需要为单元测试传递参数 void MyMethod(IList<IGrouping<int, MyObject>> objGroupings) void MyMethod(IList对象组) 目前,我已尝试初始化列表,然后按键分组: var fooList = new

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

使用上下文更新

我已经知道我无法初始化接口,但是dotnet中是否已经内置了实现

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

void MyMethod(IList<IGrouping<int, MyObject>> objGroupings)
void MyMethod(IList对象组)
目前,我已尝试初始化列表,然后按键分组:

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();
var傻瓜列表=新列表
{
新的MyObject{foo=5},
新的MyObject{foo=5},
新的MyObject{foo=5},
新的MyObject{foo=2},
新的MyObject{foo=2}
};
var fooogrouping=doulist.GroupBy(o=>o.foo.ToList();

iGroup
只是一个接口,不能初始化。如果要使用内联初始化,您需要初始化一个实现
i分组的对象

您可以初始化字典:

var dic = new Dictionary<string, int>()
{
    { "foo", 1 },
    { "bar", 2 },
};
var dic=newdictionary()
{
{“foo”,1},
{“bar”,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();
    }
}
密封类分组:i分组
{
专用只读TKey m_密钥;
私有只读IEnumerable m_元素;
公共分组(TKey、IEnumerable元素)
{
if(elements==null)
抛出新的ArgumentNullException(“元素”);
m_key=key;
m_元素=元素;
}
公钥
{
获取{return m_key;}
}
公共IEnumerator GetEnumerator()
{
返回m_元素。GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
}

这仍然没有创建
列表
。当然没有。但它在功能上是等价的(通过键访问值)。如果是针对实体模型的,并且您需要特定的类型,我认为您必须创建实现iGroup的类型(初始值设定项将与任何实现IEnuemrable并具有
Add
方法的类型一起工作)。或者,您可以创建一个简单的列表,并使用LINQ查询获得iGroup…首先,不,它不是等效的,因为
iGroup
不是通过键访问值的方法。它可以潜在地以这种方式使用,但不一定非得如此。见鬼,
GroupBy
不是这样使用的<代码>托卢库普执行。从逻辑上讲,这里不需要词典。此外,字典在逻辑上不是一个键到一系列值的映射,而是一个键到单个值的映射。您的评论有两种有效的方法,但一种方法列在问题本身中,另一种方法列在另一个答案中,因此此处也没有添加任何新内容。@Servy,正如我在回答中所写,如果您关心具有相同键的多个值,请使用列表或值字典(选择列表的类型,该类型对您的代码更有效)。。。对不起,我没有重复我的话。iGroup是一个接口。它不是一个实现——它只是在一个键下对值进行分组。。。和我在回答中建议的一样。你这么说,但你的回答没有显示出来。事实上,您的解决方案并不是该接口的实现。这需要回答这个问题。所以dotnet中没有内置的IGrouping实现?@EdmundYeung99取自“从.NET 4.0开始,在实现System.Linq.IGrouping的核心.NET框架中没有公共类型”,那么为什么它没有内置到dotnet中呢?Linq库中的大多数接口都有一个实现。。。不管怎样,谢谢你