【问题标题】:Filter dictionary string key, list object where object contains propery value过滤字典字符串键,列出对象包含属性值的对象
【发布时间】:2018-05-31 09:40:03
【问题描述】:

嗨,我有一个这个对象

public class Field 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Dictionary<string, List<Field>> fields = new Dictionary<string, List<Field>>();

fields.Add(
     "pippo", 
     new List<Field>() { 
         new Field() { Name = "1" }, 
         new Field() { Name = "2" }, 
         new Field() { Name = "3" } 
});

fields.Add(
     "pluto", 
     new List<Field>() { 
         new Field() { Name = "1" }, 
});

fields.Add(
     "paperino", 
     new List<Field>() { 
         new Field() { Name = "3" } 
});

我想从字典中删除名称字段中字符串“1”中没有值的所有键,如下例所示

fields: key "pippo" value { { Name = "1" }, { Name = "2" }, { Name = "3" } }
        key "pluto" value { { Name = "1" }}

【问题讨论】:

  • 最后一个例子,那是什么?我问是因为你已经将 paperino 与 3 个元素的列表配对,而上面的代码显示这些元素属于 pippo 键,这个例子是什么意思?您要删除什么或要保留什么?
  • 你已经尝试了什么?我们不是来做你的工作——这是思考和尝试。
  • 您的示例代码有一个错误(创建Index 的列表而不是Fields)。我已经改变了。

标签: c# list linq dictionary


【解决方案1】:

一种方法是使用 linq:

var result = fields
    .Where(f => f.Value.Any(x => x.Name == "1"))
    .ToDictionary(k => k.Key, v => v.Value);

请注意,这不会更改原始字典,而是返回一个新字典。如果要更改原始字典,只需使用它而不是var result - fields = fields.Where....

【讨论】:

  • 与我会做的类似,但我可能会使用f.Value.Any(x =&gt; x.Name == "1") 作为第一个 lambda。
  • @DavidG 我认为性能不会有任何差异(FindIndex 和 Any 都需要迭代列表),但这是一个很好的建议 - Any 更具可读性。编辑我的答案。
  • 是的,性能不是我关心的,只是可读性。但是,这是一个质量相当低的问题,这就是为什么我没有发布答案,即使示例输出与给出的描述不匹配。我认为对 VTC 更好。
  • @DavidG 我敢肯定这些只是由于 OP 不想共享实际代码而导致的简单错误。可能是在这里输入的,并没有仔细检查。我同意这不是一个高质量的问题,但我在这里看到了很多最糟糕的问题得到答案甚至赞成,所以......
  • 好吧,说有些东西已经脏了,并不是增加更多污垢的借口。
【解决方案2】:

如果你想修改现有的字典,为什么不找出键然后删除它们呢?

var keysToRemove = fields
  .Where(pair => !pair.Value.Any(item => item.Name == "1"))
  .Select(pair => pair.Key);

foreach (var key in keysToRemove)
  fields.Remove(key);

【讨论】:

    【解决方案3】:

    使用Where 调用,后跟ToDictionary

    fields = fields.Where(x => x.Value.Any(y => y.Name == "1"))
                   .ToDictionary(x => x.Key, x => x.Value);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      相关资源
      最近更新 更多