字典查询列表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();

字典查询列表c# Linq

您的编译器错误是由您在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();

说了这么多,我想知道你是否从错误的设计开始?与已定义类型的列表相比,DataTableList<Dictionary<K,V>>的使用似乎不那么直观。难道您不应该考虑定义一个具有可以使用的适当命名(和类型!)属性的类吗?

您的错误正在发生,因为list.Where( ... )的谓词是dict => dict.Where( ... ),这不是布尔值。

根据您希望代码的工作方式,您可以将其替换为list.FirstOrDefault(dict => dict.Any( ... )),这将最终返回包含键值对("word", text)的第一个字典。(我认为这是代码的预期功能,但没有进一步的信息我不能肯定。)