如何使用条件过滤字典值列表

Posted

技术标签:

【中文标题】如何使用条件过滤字典值列表【英文标题】:How to filter list of dictionary values with criteria 【发布时间】:2021-10-13 08:52:04 【问题描述】:

起初,我将一些 DataRows 放入 Dictionary 中。我做了一个例子来展示它是如何制作的,以及如何使用数据表进行相同的 linq 查询。

我想通过示例搜索具有UTI_SURNAME 值以"A" 开头且配置文件代码为2 的记录列表。

使用数据表,我将执行以下代码:

DataTable dt = new DataTable();
dt.Columns.Add("UTI_ICODE" , typeof(int));  
dt.Columns.Add("UTI_NAME", typeof(string));
dt.Columns.Add("UTI_SURNAME", typeof(string));
dt.Columns.Add("PROFIL_ICODE", typeof(int));

dt.Rows.Add(1, "Name Arnaud", "Arnaud", 1);
dt.Rows.Add(2, "Name Armand", "Armand", 2);
dt.Rows.Add(3, "Name Armelle", "Armelle", 2);
dt.Rows.Add(4, "Name Basile", "Basile", 1);
dt.Rows.Add(5, "Name Bernard", "Bernard", 2);

List<Dictionary<string, object>> lstUTI = dt.AsEnumerable().Select(
    row => dt.Columns.Cast<DataColumn>().ToDictionary(
        column => column.ColumnName,
        column => row[column]
    )).ToList();

dt.AsEnumerable().Where(x => x.Field<string>("UTI_SURNAME").StartsWith("A") && x.Field<int>("PROFIL_ICODE") == 2).ToList();

dt 的结果是:

现在,我想以这种方式查询与列表lstUTI 具有相同的结果:

lstUTI.Where(...).ToList();

我想要这样的结果:

我如何使用 LINQ 做到这一点?

【问题讨论】:

想要检查存在还是想要获取那些字典? 我修改了我的问题以便更好地解释。 【参考方案1】:

你可以很容易地通过使用字典的索引操作符来做到这一点:

var result = lstUTI.Where(dict => 
                    dict["UTI_SURNAME"].ToString().StartsWith("A")
                    && (int)dict["PROFIL_ICODE"] == 2);

如果要打印结果:

foreach (Dictionary<string, object> row in result)

    Console.WriteLine(new string('=', 10));
    foreach (KeyValuePair<string, object> cell in row)
    
        Console.WriteLine($"cell.Key: cell.Value");
    

那么输出将如下所示:

UTI_ICODE: 2
UTI_NAME: Name Armand
UTI_SURNAME: Armand
PROFIL_ICODE: 2
==========
UTI_ICODE: 3
UTI_NAME: Name Armelle
UTI_SURNAME: Armelle
PROFIL_ICODE: 2

我想强调的是,上述解决方案并非万无一失。在对值执行任何操作之前,您应该检查键是否存在。

【讨论】:

原来如此简单^^我为什么要寻找更复杂的解决方案?

以上是关于如何使用条件过滤字典值列表的主要内容,如果未能解决你的问题,请参考以下文章

如何根据任意条件函数过滤字典?

如何过滤复杂对象的列表,以便如果两个具有字段值,我会根据条件删除一个

python基础一 -------如何在列表字典集合中根据条件筛选数据

如何根据多个条件过滤列表?

class08_过滤数据

使用字典理解过滤 defaultdict