【问题标题】:How do you add an IGrouping<> 'object' to a list?如何将 IGrouping<> 'object' 添加到列表中?
【发布时间】:2018-03-20 12:50:41
【问题描述】:

所以。我有一个列表属性,它对具有相同名称的值进行分组;

List<IGrouping<string, MyItemDTO>> MyList { get; set; }

它最初是通过 IQueryable&lt;&gt; 从数据库中填充的。

但是假设我想使用代码向此列表中添加一个新项目,我该怎么做呢?由于 IGrouping 是一个接口,所以我不能像这样完全更新它;

IGrouping<string, MyItemDTO> newGroup =  new IGrouping<string, MyItemDTO>();
MyList.Add(newGroup);

这行不通。我想知道,'是什么?我如何在那里获得新物品?

非常感谢。

编辑:

一点看法:

想象一下有两个或更多城市。这些城市有几条街道名称相匹配。 IGrouping&lt;,&gt; 确保街道名称在列表中只出现一次。因此,数据绑定的Combobox 不会重复任何值(通常是因为最终用户不知道这条街道属于哪个城市)。

我的视图有两个Comboboxes。一个用于街道,另一个用于城市。如果选择了一条街道,则视图模型将选择相应的城市,除非街道组中包含多条街道。此时,系统将提示用户手动选择街道所在的城市。

我认为IGrouping&lt;,&gt; 适合此目的,因为它是使用 GroupBy() 扩展方法时的默认返回类型。不过仍然愿意接受建议。

【问题讨论】:

  • 你没有。 IGroupingGroupBy 返回的东西。它显然不是设计为可在提供程序之外构建的。如果你坚持你当然可以实现自己的IGrouping——但更明智的方法是将IGroupings 转换为其他东西,比如Dictionary&lt;string, List&lt;..&gt;&gt;
  • 您或许应该解释一下您的原始问题,以及为什么您认为IGrouping&lt;,&gt; 可以解决它。
  • 你可以使用泛型创建一个新的IGrouping实例去this solution
  • @PanagiotisKanavos 我已经更新了我的描述,提供了一些背景故事来说明是什么导致我这样做。也许你可以再看看?

标签: c# .net wpf list collections


【解决方案1】:

使用此方法创建 IGrouping 值:

IGrouping<string, MyItemDTO> GetIGrouping(string key,MyItemDTO item)
{
    return new[] {item}.GroupBy(val => key).First();
}

或者,如果您想将多个项目分组:

IGrouping<string, MyItemDTO> GetIGrouping(string key,IEnumerable<MyItemDTO> items)
{
    return items.GroupBy(val => key).First();
}

【讨论】:

  • 请注意,当简单地添加到列表中时,如果意图让列表包含 unique 分组(通常由GroupBy 方法)。在编写对列表进行操作的代码时需要考虑到这一点。
【解决方案2】:

要么使用GroupBy 调用IEnumerable&lt;T&gt; 来产生你想要的东西,要么按照this answer to a question about that particular approach 实现IGrouping&lt;TKey, TElement&gt;

【讨论】:

    【解决方案3】:

    我认为您的 Property 中确实不需要 IGrouping,而是您需要像 DictionaryList 等这样的集合。

    如果你想要它,那么这里是你应该如何使用 IGrouping 添加项目

    var t = new List<Test>();
    foreach (var item in t.GroupBy(x => x.A))
    {
      A.MyList.Add(item);
    }
    

    public static class A
    {
        public static List<IGrouping<string, Test>> MyList { get; set; }
    }
    

     public class Test
        {
            public string A { get; set; }
            public int B { get; set; }
        }
    

    希望有帮助!!

    【讨论】:

    • 我已经更新了描述以阐明这个场景。出于好奇,字典如何更适合?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2020-01-30
    • 1970-01-01
    • 2020-08-25
    相关资源
    最近更新 更多