[英]C# Linq on a list of dictionaries to filter it
我有一个问题,就是不知道如何正确使用LINQ。
我有一个这样的Dictionaries(string, object)
List
Dictionaries(string, object)
:
[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
的词典的Dictionaries
List
,因此输出应为:
[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; }
}
现在,您可以创建这些类型的实例,而不必弄乱object
。 例如
var m = new MyType { Field1 = 1500, Field2 = "dog", Field3 = "blue" };
您也可以将其放入集合中:
var myList = new[] { m };
甚至从该列表中选择满足您条件的元素:
var result = myList.Where(x => x.Field1 == 1500);
请注意, Field1
是整数类型,因此,例如,如果将值与"MyValue"
进行比较,则会出现编译器错误。 在您的解决方案中,二项值的类型为object
,因此您可以将任何内容 (而不只是数字)存储到Field1
。
除此之外,您还应该为成员使用一些有意义的名称,例如Color
代替Field2
, Animal
代替Field2
。
这应该工作:
var result =
dicts.Where(
d => d.TryGetValue("field1", out object value) && value is int i && i == 1500
).ToList();
这将选择列表中所有具有名为field1
的字段的字典(通过d.TryGetValue()
),并且该值也是1500
。
需要注意的是,因为字典包含object
,而不是int
,你需要检查,如果该值int
使用is int i
。
另请注意,此语法使用C#版本7或更高版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.