我有一个问题,不知道如何正确使用LINQ。
我有这样的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"
我需要得到List
的Dictionaries
,只有将"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();
请问你能给我一个解决方案吗?
非常感谢你。
这应该工作:
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或更高版本。
虽然您可以将整个模型编写为集合(集合......)的集合,但这只是一个好主意,因为它无法理解和维护。你应该明确地创建自己的类,例如:
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"
进行比较,则会出现编译器错误。在您的解决方案中,dicitonaries值的类型为object
,因此您可以将任何内容存储到Field1
中,而不仅仅是数字。
除此之外,您还应该为您的会员使用一些有意义的名称,例如: Color
而不是Field2
和Animal
而不是Field2
。