C# 筛选字典字符串键,列出对象包含属性值的对象

C# 筛选字典字符串键,列出对象包含属性值的对象,c#,list,linq,dictionary,C#,List,Linq,Dictionary,嗨,我有一个关于这个物体的 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 L

嗨,我有一个关于这个物体的

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" } 
});
如果您想修改现有的字典,为什么不找出键,然后删除它们呢

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

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

一种方法是使用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
调用,然后调用
ToDictionary

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

最后一个例子是什么?我这样问是因为您已经将paperino与3个元素的列表配对,而上面的代码显示这些元素属于pippo键,那么这个示例意味着什么?您想删除什么或保留什么?您已经尝试了什么?我们不是来做你的工作的-这是思考和尝试。你的示例代码有一个错误(创建
索引的列表而不是
字段的列表)。我已经改变了这一点。与我将要做的类似,尽管我可能会对第一个lambda使用
f.Value.Any(x=>x.Name==“1”)
。@DavidG我认为性能不会有任何差异(FindIndex和Any都需要迭代列表),但这是一个好的建议-Any更具可读性。编辑我的答案。是的,性能不是我关心的,只是可读性。然而,这是一个非常低质量的问题,这就是为什么我没有发布答案,即使示例输出与给出的描述不匹配。在我看来,最好是职业训练局。@DavidG我相信这些都是由于OP不想分享实际代码而导致的简单错误。可能是在这里打的,没有仔细检查。我同意这不是一个高质量的问题,但我在这里看到了很多最糟糕的问题得到了答案,甚至是投票结果,所以…说有些东西已经脏了,并不是增加更多脏东西的借口。
fields = fields.Where(x => x.Value.Any(y => y.Name == "1"))
               .ToDictionary(x => x.Key, x => x.Value);