【问题标题】:IEnumerable<T> to IDictionary<U, IEnumerable<T>>IEnumerable<T> 到 IDictionary<U, IEnumerable<T>>
【发布时间】:2011-02-28 20:24:23
【问题描述】:

IEnumerable&lt;T&gt; 转换为IDictionary&lt;U, IEnumerable&lt;T&gt;&gt; 的最有效方法是什么

其中 U 是,例如 Guid,其信息保存在 T 的属性中。

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

示例

对象定义:

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

    // other properties
}

开始于:

IEnumerable<myObject> listOfObj;

结尾:

IDictionary<Guid, IEnumerable<myObject>> dictOfLists;

其中listOfObj 包含具有许多不同但有时重叠的 UID 属性值的对象。

【问题讨论】:

  • 你的解释有点混乱。也许如果你提供一个例子,它会澄清事情。

标签: c# .net ienumerable type-conversion idictionary


【解决方案1】:

使用 LINQ:

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

【讨论】:

  • 这构建了一个与IDictionary&lt;U, IEnumerable&lt;T&gt;&gt; 不完全相同的IDictionary&lt;U, IGrouping&lt;U, T&gt;&gt;
  • 或使用.AsEnumerable() 代替.Select()。或者只是转换grouping,因为IGrouping&lt;T&gt;继承自IEnumerable&lt;T&gt;
  • AsEnumerable 立即评估集合,而 Select 保持延迟 - 所以 Select 更可取,而且转换也不会像 Select 那样改变类型 - 调用者仍然可以将其转换回,这也不是你想要的行为。
  • @Femaref - 我刚刚测试过,AsEnumerable肯定被推迟了。
  • 哦,我把那个混在一起了——是的,它被推迟了,因为它只是返回了传入的序列。但是,这仍然可以让调用者将其转换回使用的任何实现(IGrouping 或类似),这是您绝对不想要的。
【解决方案2】:

最有效的转换方法肯定是编写IDictionary&lt;U, IEnumerable&lt;T&gt;&gt;接口的实现,它在构造函数中接受IEnumerable&lt;T&gt;,并实现所有操作使用查找给定的IEnumerable&lt;T&gt; 的苍蝇。这样转换本身就是 O(1)。

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

【讨论】:

  • 谢谢 - 我也喜欢这里的想法...不过我担心转换后的性能。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    var dictionary = list.GroupBy(i => i.Guid,
                                  (guid, i) => new { Key = guid, i })
                         .ToDictionary(i => i.Key, i => i);
    

    这会将原始列表分组到常见的 Guid 上,然后为您提供一个以该 Guid 作为键的字典。

    【讨论】:

    • 这构建了一个与IDictionary&lt;U, IEnumerable&lt;T&gt;&gt; 不完全相同的IDictionary&lt;U, IGrouping&lt;U, T&gt;&gt;
    • @Remus - 虽然它不是最漂亮的,但上面的代码应该可以按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多