C# C Linq在字典列表上对其进行筛选
我有一个问题,不知道如何正确使用LINQ 我有一个字典字符串列表,对象如下:C# C Linq在字典列表上对其进行筛选,c#,.net,list,linq,dictionary,C#,.net,List,Linq,Dictionary,我有一个问题,不知道如何正确使用LINQ 我有一个字典字符串列表,对象如下: [0] -> "field1":1500, "field2":"dog", "field3":"blue" [1] -> "field1":1700, "field2":"cat", "field3":"brown" [2] -> "field1":1500, "field2":"horse", "field3":"white" [3] -> "field1":1900, "field2":"c
[0] -> "field1":1500, "field2":"dog", "field3":"blue"
[1] -> "field1":1700, "field2":"cat", "field3":"brown"
[2] -> "field1":1500, "field2":"horse", "field3":"white"
[3] -> "field1":1900, "field2":"cow", "field3":"black"
我需要从中获得一个字典列表,其中只有field1设置为1500的字典,因此输出应该是:
[0] -> "field1":1500, "field2":"dog", "field3":"blue"
[1] -> "field1":1500, "field2":"horse", "field3":"white"
我试着这样做,但我肯定我离正确答案还差得远
List<Dictionary<string, object>> output = input.SelectMany(r => r).Where(r => (r.Key == "field1") && (r.Value == 1500)).ToList();
你能给我一个解决方案吗
非常感谢。虽然您可以将整个模型编写为一组集合。。。这只是一个好主意,因为它不可能被理解和维持。您应该明确创建自己的类,例如:
class MyClass
{
public int Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
}
现在您可以创建这些类型的实例,而不必处理对象。例如
您还可以将其放入集合:
var myList = new[] { m };
甚至从该列表中选择满足条件的元素:
var result = myList.Where(x => x.Field1 == 1500);
请注意,Field1的类型为integer,因此如果您将该值与MyValue进行比较,则会出现编译器错误。在您的解决方案中,dicitonaries值属于object类型,因此您可以将任何内容存储到Field1中,而不仅仅是数字
除此之外,您还应该为您的成员使用一些有意义的名称,例如颜色而不是字段2,动物而不是字段2。同时您可以将整个模型作为集合集合来编写。。。这只是一个好主意,因为它不可能被理解和维持。您应该明确创建自己的类,例如:
class MyClass
{
public int Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
}
现在您可以创建这些类型的实例,而不必处理对象。例如
您还可以将其放入集合:
var myList = new[] { m };
甚至从该列表中选择满足条件的元素:
var result = myList.Where(x => x.Field1 == 1500);
请注意,Field1的类型为integer,因此如果您将该值与MyValue进行比较,则会出现编译器错误。在您的解决方案中,dicitonaries值属于object类型,因此您可以将任何内容存储到Field1中,而不仅仅是数字
除此之外,您还应该为您的成员使用一些有意义的名称,例如颜色而不是字段2,动物而不是字段2。这应该适用于:
var result =
dicts.Where(
d => d.TryGetValue("field1", out object value) && value is int i && i == 1500
).ToList();
这将通过d.TryGetValue选择列表中具有名为field1的字段的所有词典,其中该值也是1500
注意,因为字典包含object而不是int,所以需要使用is int i检查值是否为int
还要注意,此语法使用的是C版本7或更高版本。这应该可以:
var result =
dicts.Where(
d => d.TryGetValue("field1", out object value) && value is int i && i == 1500
).ToList();
这将通过d.TryGetValue选择列表中具有名为field1的字段的所有词典,其中该值也是1500
注意,因为字典包含object而不是int,所以需要使用is int i检查值是否为int
还要注意的是,这种语法使用的是C版本7或更高版本。我还没有找到正确的答案,为什么你会这样想?您得到的结果是什么?不要将集合用作属性,而是学习实现自定义类List FilterAdditionaries=dictionary.Wheredictionary=>dictionary.ContainesKeyField1&&intdictionary[field1]==1500.ToList;可能是@LeonidVasilyev的复制品这是一种被认为是复制品的泛型。我根本就没有找到正确的答案。你为什么这么认为?您得到的结果是什么?不要将集合用作属性,而是学习实现自定义类List FilterAdditionaries=dictionary.Wheredictionary=>dictionary.ContainesKeyField1&&intdictionary[field1]==1500.ToList;可能是@LeonidVasilyev的复制品,这是将其视为复制品的一般方法。谢谢你,你的回答完全符合我的需要@否决票:我很想知道这个答案被否决的原因。我如何改进这个答案?没有解释的否决票不是特别有用…谢谢你,你的回答完全符合我的需要@否决票:我很想知道这个答案被否决的原因。我如何改进这个答案?没有解释的否决票不是特别有用。。。