Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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# IEnumerable<;T>;到IDictionary<;U、 IEnumerable<;T>&燃气轮机;_C#_.net_Ienumerable_Type Conversion_Idictionary - Fatal编程技术网

C# IEnumerable<;T>;到IDictionary<;U、 IEnumerable<;T>&燃气轮机;

C# IEnumerable<;T>;到IDictionary<;U、 IEnumerable<;T>&燃气轮机;,c#,.net,ienumerable,type-conversion,idictionary,C#,.net,Ienumerable,Type Conversion,Idictionary,将IEnumerable转换为IDictionary 其中,U是一个Guid,其信息保存在T的属性中 基本上,这会创建一个列表字典,其中原始列表中的所有项都基于对象中某个属性的值进行分组 示例 对象定义: class myObject { public Guid UID { get; set; } // other properties } 首先: IEnumerable<myObject> listOfObj; IEnumerable列表对象; 以: IDi

IEnumerable
转换为
IDictionary

其中,U是一个Guid,其信息保存在T的属性中

基本上,这会创建一个列表字典,其中原始列表中的所有项都基于对象中某个属性的值进行分组

示例

对象定义:

class myObject
{
    public Guid UID { get; set; }

    // other properties
}
首先:

IEnumerable<myObject> listOfObj;
IEnumerable列表对象;
以:

IDictionary<Guid, IEnumerable<myObject>> dictOfLists;
i词典目录;
其中,
listOfObj
包含UID属性具有许多不同但有时重叠值的对象。

使用LINQ:

var dict = input.GroupBy(elem => elem.Identifier)
                .ToDictionary(grouping => grouping.Key, grouping => grouping.Select(x => x));

我想你可能想要这样的东西:

var dictionary = list.GroupBy(i => i.Guid,
                              (guid, i) => new { Key = guid, i })
                     .ToDictionary(i => i.Key, i => i);
这将在公共Guid上对原始列表进行分组,然后给您一个以该Guid为键的字典。

最有效的转换方法无疑是编写一个
IDictionary
接口的实现,该接口在构造函数中接受一个
IEnumerable
,并使用对给定
IEnumerable
的查找动态执行所有操作。这样,转换本身就是O(1)

但是,这样的实现不会有好的性能(但这与转换效率无关)。

作为“映射到一个或多个值的键集合”的
ILookup
IDictionary
不同,但它是等效的,并且在某些方面更好。这当然很容易创建:

var myLookup = listOfObj.ToLookup(x => x.UID);

你的解释有点令人困惑。如果您提供一个示例,可能会澄清问题。这将生成一个与
IDictionary
不完全相同的
IDictionary
。或者使用
.AsEnumerable()
而不是
。Select()
。或者直接强制转换
grouping
,因为
IGrouping
继承自
IEnumerable
asemerable
立即计算集合,而
Select
保持延迟状态-因此
Select
更可取,而且强制转换不会更改
Select
之类的类型-调用者仍然可以将其强制转换回来,这也不是你想要的行为。@Femaref-我刚刚测试了它,而且
AsEnumerable
肯定是延迟的。哦,我把它混在一起了-是的,它是延迟的,因为它只是返回传入的序列。但是,这仍然可以使调用方将其转换回您绝对不希望使用的任何实现(
i分组
或类似的实现)。这构建了一个与
i词典
不完全相同的
i词典
@Remus-虽然它不是最漂亮的,上面的代码应该像预期的那样工作。谢谢-我也喜欢这里的想法。。。不过,我担心转换后的性能。