Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在列表中查找具有给定属性值的对象,然后查找字典值_C#_Linq_Dictionary - Fatal编程技术网

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来查找键/值对。@pfinferno
First
是返回查找对的最便宜的方法,一旦找到第一个匹配项,它将停止迭代
Where
Single
将迭代整个枚举,这会更昂贵。
var pair = models.First(m => m.Name == stringToFind)
                ?.Fields
                 .First(f => f.Key = keyToFind);