2017-05-05 22 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

相關問題