2012-09-13 58 views
4

我有一個List< Dictionary < string, object >>變量,如下所示。在列表中搜索一個值<Dictionary <string,object >>

private static List<Dictionary<string, object>> testData = new List<Dictionary<string, object>>(100); 

// Just Sample data for understanding. 
for (int i = 0; i < 100; i++) 
{ 
    var test = new Dictionary<string, object> 
     { 
      { "aaa", "aaa" + i % 4 }, 
      { "bbb", "bbb" + i % 4 }, 
      { "ccc", "ccc" + i % 4 }, 
      { "ddd", "ddd" + i % 4 }, 
      { "eee", "eee" + i % 4 }, 
      { "fff", "fff" + i % 4 }, 
      { "ggg", "ggg" + i % 4 }, 
      { "hhh", "hhh" + i % 4 }, 
      { "iii", "iii" + i % 4 } 
     }; 
    testData.Add(test); 
} 

我想搜索鍵,值的字典的列表,並返回List< Dictionary < string, object >>包含我通過是searchPattern。

Dictionary<string, object> searchPattern = new Dictionary<string, object>(); 
searchPattern .Add("aaa", "aaa4"); 
searchPattern .Add("eee", "eee2"); 
searchPattern .Add("fff", "fff1"); 
searchPattern .Add("ddd", "ddd3"); 


public List<Dictionary<string, object>> SearchList(List<Dictionary<string, object>> testData, Dictionary<string, object> searchPattern) 
{ 
    List<Dictionary<string, object>> result; 

    // Search the list. 

    return result; 
} 

任何其他建議,搜索也讚賞。 非常感謝!

+0

我不我不明白這個問題。你的例子的預期輸出是什麼? – verdesmarald

+0

你希望返回什麼結果? –

+0

@veredesmarald,@ Cuong Le:在列表中的100行中,我想搜索包含所有鍵值對「aaa」,「aaa4」&「eee」,「eee2」&「fff」的行, 「fff1」和「ddd」,「ddd3」並單獨返回。 –

回答

1

這將返回一個包含搜索模式的所有鍵值對列表中的第一部字典,或null如果重複的值,這將失敗沒有一個。

public Dictionary<string, object> SearchList 
(
    List<Dictionary<string, object>> testData, 
    Dictionary<string, object> searchPattern 
) 
{ 
    return testData.FirstOrDefault(x => searchPattern.All(x.Contains)); 
} 

如果你想把所有的匹配(而不只是第一種)使用Where([...]).ToList()而不是FirstOrDefault([...])

+0

@RameshDurai有沒有理由不接受這個答案?據我所知,它跟你以後接受的其他答案一樣,但是更清潔? – verdesmarald

+0

是的。你的答案正在起作用。但它僅返回第一個值,我期望所有數據。 Where([...]),ToList()應該工作。 –

+0

@RameshDurai我用'FirstOrDefault'因爲你的評論說「我想搜索包含所有鍵值對的行[...]並且單獨返回「...... alone!=一個事物列表 – verdesmarald

1

讓我試試:

public static List<Dictionary<string, object>> SearchList(List<Dictionary<string, object>> testData, Dictionary<string, object> searchPattern) 
    { 
     return testData.Where(t => 
      { 
       bool flag = true; 
       foreach (KeyValuePair<string, object> p in searchPattern) 
       { 
        if (!t.ContainsKey(p.Key) || !t[p.Key].Equals(p.Value)) 
        { 
         flag = false; 
         break; 
        } 
       } 
       return flag; 
      }).ToList(); 

    } 

OR

public static List<Dictionary<string, object>> SearchList(List<Dictionary<string, object>> testData, Dictionary<string, object> searchPattern) 
    { 
     return testData 
        .Where(t => searchPattern.All(p => t.ContainsKey(p.Key) && 
                t[p.Key].Equals(p.Value))) 
        .ToList(); 
    } 
+0

謝謝!它的工作就像一個魅力:) –

+0

抱歉不接受你的答案。由於@veredesmarald答案也工作,他是第一個回答我接受他的。希望你會同意。 –

+1

@RameshDurai無論如何,這是你選擇。沒關係。 – horgh

0

有幾個這樣做的方法。 _Individuals1 = file1.fileIndividuals; _Individuals2 = file2.fileIndividuals;

foreach (KeyValuePair<int, Individual> kvpInd in _Individuals1) 
    { 
     foreach (KeyValuePair<int, Individual> kvpInd2 in _Individuals2) 
     { 
      if (kvpInd.Value.name.name == kvpInd2.Value.name.name) 
      { 
       similarInds.Add(kvpInd.Key, kvpInd.Value); 
      } 
     } 
    } 

var similarInds = file1.fileIndividuals. 
Where(kv1 => file2.fileIndividuals.Any(kv2 => kv1.Value.name.name == kv2.Value.name.name)). 
ToDictionary(kv => kv.Key, kv => kv.Value); 

如果您在使用LINQ,你可以像這樣

1

如果我理解正確:

var result = testData.Where(dic => searchPattern.All(dic.Contains)) 
        .ToList(); 
+0

對不起,這不起作用 –

+0

@RameshDurai:你給了什麼錯誤? –

+0

I 'm期望類型爲List >的結果,但它返回的是IEnumerable >。 –

0

我同意armen.shimoon,但是這樣的事情:

public static List<Dictionary<string, object>> SearchList(this List<Dictionary<string, object>> list, 
     Dictionary<string, object> searchPattern) 
    { 
     return list.Where(item => 
      searchPattern.All(x => item.ContainsKey(x.Key) && 
       x.Value.Equals(item[x.Key]) 
      )).ToList(); 
    } 

,然後使用這樣的:

searchResult = testData.SearchList(searchPattern); 
+0

難道你不認爲這個答案已經提到過嗎?...甚至沒有一次 – horgh

+0

是的,科斯特亞,你說的對,對不起 – Felix

相關問題