2015-06-01 107 views
-4

我想通過字典鍵和值使用LINQ查詢字典的列表。以下給我的錯誤「無法轉換keyvaluepair鍵入布爾。」 在此先感謝。查詢字典的列表C#Linq

var list = new List<Dictionary<string, object>>(); 

    foreach (DataRow row in wordCloud.Rows) 
    { 
     var dict = new Dictionary<string, object>(); 

     foreach (DataColumn col in wordCloud.Columns) 
     { 
      dict[col.ColumnName] = row[col]; 

     } 


    list.Add(dict); 

    } 


    if (!string.IsNullOrWhiteSpace(text)) 
    { 
     var item = list.Where(dict => dict.Where(x => x.Key == "word" && x.Value == text)).FirstOrDefault(); 
    } 

感謝這就是我使用的。

var item = list.Where(dict => dict["WORD"].Equals(text)).FirstOrDefault(); 
+0

。哪裏需要一個表達式可以評估bool值。嘗試使用list.Select – Guanxi

+0

'dict.Where(x => x.Key ==「word」&& x.Value == text)'從字典中返回一組keyvaluepairs。所以你要求「給我從列表中收集字典條目的項目」。英語也沒有意義。 – Blorgbeard

+1

'dict.Where(x => x.Key ==「word」&& x.Value == text)' - 這是完全以錯誤的方式使用字典。使用該密鑰的字典中不會有一個以上的項目。不要循環,直接去找它。如果您不確定存在該項的項目,請先使用ContainsKey進行檢查。不要強迫自己使用Linq,如果這樣做沒有意義。 –

回答

0

編譯器錯誤是由您的謂詞list.Where不使用布爾表達式引起的。 dict.Where(...)將產生一個IEnumerable<KeyValuePair<K,V>>,這不是布爾操作。此外,你的技術濫用字典,因爲它只會有一個具有給定鍵的對,所以不需要循環。爲了處理這兩個問題,我建議編寫一個方法來調查字典併爲匹配生成布爾結果。

bool DictionaryContainsText(Dictionary<string, object> dictionary, string text) 
{ 
    string key = "word"; 
    if (dictionary.ContainsKey(key) && dictionary[key] != null) 
    { 
     return dictionary[key].Equals(text); 
    } 

    return false; 
} 

然後,您可以在篩選列表中使用此方法。

var item = list.Where(dict => DictionaryContainsText(dict, text)).FirstOrDefault(); 

所有這一切說,我不知道你是從錯誤的設計入手? A DataTableList<Dictionary<K,V>>似乎比定義類型的列表使用起來不太直觀。你是否應該考慮用適當命名(和鍵入!)屬性來定義一個你可以消耗的屬性?這是一個活動,供您考慮。

+0

爲什麼要強制這樣的解決方案?請閱讀我對這個問題的評論。 –

+0

@MaciejLos,他正在讀取多行並正在使用列名作爲鍵。他不能爲此使用單個字典(多行,同一個鍵的多個用法)。我對提問者的問題是不同的,我不確定他應該使用字典*。 –

+0

我看到了你的評論,我需要說這是一個很好的問題! –

0

你的錯誤發生,因爲list.Where(...)謂語是dict => dict.Where(...)這不是一個布爾值。

根據您希望代碼的工作方式,您可以用list.FirstOrDefault(dict => dict.Any(...))替代它,最終返回包含鍵值對(「word」,text)的第一個字典。 (我認爲這是代碼的預期功能,但如果沒有進一步的信息,我不能肯定。)