字典查询列表c# Linq
本文关键字:Linq 列表 查询 字典 | 更新日期: 2023-09-27 17:52:47
我正在尝试使用linq查询字典键和值的字典列表。下面给出了"不能将keyvaluepair转换为bool类型"的错误。提前谢谢。
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();
您的编译器错误是由您在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();
说了这么多,我想知道你是否从错误的设计开始?与已定义类型的列表相比,DataTable
到List<Dictionary<K,V>>
的使用似乎不那么直观。难道您不应该考虑定义一个具有可以使用的适当命名(和类型!)属性的类吗?
您的错误正在发生,因为list.Where( ... )
的谓词是dict => dict.Where( ... )
,这不是布尔值。
根据您希望代码的工作方式,您可以将其替换为list.FirstOrDefault(dict => dict.Any( ... ))
,这将最终返回包含键值对("word", text)的第一个字典。(我认为这是代码的预期功能,但没有进一步的信息我不能肯定。)