从List <dictionary <string,object =“” >>中查找和删除元素

时间:2018-11-15 09:08:32

标签: c# .net linq dictionary

我目前正在使用C#4.7.2应用程序。我要为自定义类型编写扩展方法,很不幸,我在LINQ查询中苦苦挣扎。

我需要过滤List<Dictionary<string, object>>以便使用特定键在列表中找到Dictionary<string, object>的元素并将其从列表中删除。此外,列表条目可以为空。

一个列表条目(字典)可能看起来像这样,可能有多个带有值键A的元素,我实际上需要删除所有这些元素:

Key    |  Value
"MyId" : "A",
"Width" : 100,
"Length" : 50

非常简单的结构。棘手的事情是在列表中找到字典元素。我的扩展方法如下:

public static List<Dictionary<string, object>> RemoveItem(this List<Dictionary<string, object> items, string value)
{
    var itemToRemove = items.FirstOrDefault(x => x.ContainsKey("MyId")).Values.Contains(value);

    items.Remove(itemToRemove);

    return items;
}

不幸的是,此LINQ查询无法正常工作。

您知道如何解决此问题吗?

非常感谢您!

5 个答案:

答案 0 :(得分:2)

您要删除所有带有键和值的内容吗?您甚至不需要LINQ:

public static int RemoveItems(this List<Dictionary<string, object>> dictionaryList, string value)
{
    int removed = dictionaryList
        .RemoveAll(dict => dict.TryGetValue("MyId", out object val) && value.Equals(val));
    return removed;
}

答案 1 :(得分:1)

您可以使用列表的方法(foo.getX() == null ? foo.setX(new X()) : foo.getX()).setY(...); 。然后,您输入一个检查字典的谓词(它是RemoveAll的集合):

KeyValuePair<TKey, TValue>

或根据Tim Schmelter的建议:

items.RemoveAll(dict => dict.Any(kv => kv.Key == "MyId" && ( kv.Value as string ) == "A"));

答案 2 :(得分:0)

您需要执行以下操作:

itemsToRemove = items.Where(x => x.ContainsKey("MyId") && x["MyId"].ToString() == value);

答案 3 :(得分:0)

根据您的描述,您似乎想要第一个包含键的字典,该键具有参数value中的值。那就是items.FirstOrDefault(x => x.ContainsKey(value))

您正在做的是获取包含一个预定义键"myId"的字典,然后遍历字典中的对象,并将其值与value参数进行比较,这不是您想要的描述。

如果您希望更多词典包含给定键,并且要删除所有词典,则应使用list.RemoveAll(dict => dict.ContainsKey(value))

答案 4 :(得分:0)

public static List<Dictionary<string, object>> RemoveItem(this List<Dictionary<string, object>> items, string value, string key)
{
    foreach (var item in items)
    {
        if(item.ContainsKey(key) && item[key] == value)
        {
            item.Remove(key);
        }
    }

    return items;
}

这会很好用的。

相关问题