C# 在列表中查找具有给定属性值的对象,然后查找字典值
我有一个物品清单。这些对象中的每一个都有一个C# 在列表中查找具有给定属性值的对象,然后查找字典值,c#,linq,dictionary,C#,Linq,Dictionary,我有一个物品清单。这些对象中的每一个都有一个Name属性,一个observedArcCollection,它只是一个与字典工作方式完全相同的自定义字典,具有一个键/值对 给定两个字符串,一个用于名称,一个用于键,我想找到首先匹配给定名称的对象,然后从该模型的字典中选择匹配给定键值的对 示例:给定字符串“model1”作为名称,“Latitude”作为键,应找到名称属性等于model1的对象,然后应返回对象字典中键等于Latitude的键/值对 目前,我可以使用以下方法完成第一部分以匹配名称: p
Name
属性,一个observedArcCollection
,它只是一个与字典工作方式完全相同的自定义字典,具有一个键/值对
给定两个字符串,一个用于名称,一个用于键,我想找到首先匹配给定名称的对象,然后从该模型的字典中选择匹配给定键值的对
示例:给定字符串“model1”作为名称,“Latitude”作为键,应找到名称属性等于model1
的对象,然后应返回对象字典中键等于Latitude
的键/值对
目前,我可以使用以下方法完成第一部分以匹配名称
:
private ObservableCollection<ModelBase> models;
//add objects to models
string stringToFind = "model1";
models.Single(m => m.Name == stringToFind);
如果可能的话,我想使用LINQ,但如果不是,那也不是什么大不了的事。首先,为什么要使用单一的?必须只有一个对象具有给定的名称
,并且必须在此特定代码中强制执行它吗?请记住,Single
非常昂贵,因为它将枚举整个集合,以确保找到的对象是唯一的
如果您只是想找到第一个(如果有的话),那么只需使用恰当命名的first
扩展方法:
models.First(m => m.Name == stringToFind);
好的,这将返回具有给定名称的第一个对象,如果有,只需过滤字段
proyerty:
var pair = models.First(m => m.Name == stringToFind)
?.Fields
.First(f => f.Key = keyToFind);
如果我理解正确,您需要这样的东西:models.Single(m=>m.Name==“someName”).Fields.Single(f=>f.Key==“Latitude”)
@Nino为什么在字典中搜索关键字时使用Single
呢?@InBetween,你说得对,First()
是更好的方法。谢谢你@Nino,InBetween是一种更便宜的方法,但你的方法确实可以达到这个目的。当然,这些对象总是有6个实例,每个实例都有一个唯一的名称。因此,一旦我找到了一个具有正确名称的,我就不必使用single来查找键/值对。@pfinfernoFirst
是返回查找对的最便宜的方法,一旦找到第一个匹配项,它将停止迭代Where
或Single
将迭代整个枚举,这会更昂贵。
var pair = models.First(m => m.Name == stringToFind)
?.Fields
.First(f => f.Key = keyToFind);