2017-05-05 66 views
0

我有一个对象列表。这些对象中的每一个都有一个Name属性,而ObservablePairCollection只是一个自定义字典,其工作方式与字典完全一样,具有键/值对。查找具有给定属性值的列表中的对象,然后查找字典值

给定两个字符串,一个用于名称和一个用于键,我想查找首先匹配给定名称的对象,然后从该模型的字典中选择与给定键值匹配的pair

示例:给定名称的字符串“model1”和该键的“Latitude”,应该找到名称为property的对象等于model1的对象,然后应该返回对象字典中的键/值对,键等于Latitude

目前我能做的第一部分通过对Name匹配:

private ObservableCollection<ModelBase> models; 
//add objects to models 

string stringToFind = "model1"; 

models.Single(m => m.Name == stringToFind); 

那么,这将返回谁的Name属性等于model1的对象。

虽然我无法找到正确的语句来获取键/值对。

下面是类的相对部分:

private ObservablePairCollection<string, string> _fields = new ObservablePairCollection<string, string>(); 
public ObservablePairCollection<string, string> Fields 
{ 
    get { return _fields; } 
    set { _fields = value; OnPropertyChanged("Fields"); } 
} 

private string _name; 
public string Name 
{ 
    get { return _name; } 
    protected set 
    { 
     if (_name != value) 
     { 
      _name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 
} 

我想如果可以使用LINQ,但不是一个大问题,如果不行。

+1

如果我理解正确的,你需要的是这样的:'models.Single(M => m.Name == “someName”)Fields.Single(F => f.Key ==“Latitude”);' – Nino

+0

@Nino为什么会y在字典中搜索密钥时,是否使用'Single'? – InBetween

+0

@InBetween,你说得对,'First()'是更好的方法。 – Nino

回答

1

首先,为什么Single?必须只有一个对象与给定的Name,你必须执行它在这个特定的代码?请记住,Single是昂贵的,因为它会枚举整个集合以确保找到的对象是唯一的。

如果你是在寻找第一个,如果有的话,那么只需使用适当命名的First扩展方法只是感兴趣:

models.First(m => m.Name == stringToFind); 

好了,以给定Name,如果有返回的第一个对象,你只需要过滤Fields proyerty:

var pair = models.First(m => m.Name == stringToFind) 
       ?.Fields 
       .First(f => f.Key = keyToFind); 
+0

那么,总会有这些对象的6个实例,每个实例都有一个唯一的名字。因此,一旦我找到名称正确的人,我不必使用单个查找键/值对。 – pfinferno

+1

@pfinferno'First'是返回寻找对的最便宜的对象,一旦找到第一个匹配就会停止迭代。 'Where'或'Single'将遍历整个枚举,这更加昂贵。 – InBetween

相关问题