Найти и удалить элементы из списка> - PullRequest
0 голосов
/ 15 ноября 2018

В настоящее время я работаю над приложением 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 голосов
/ 15 ноября 2018
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;
}

Это сработает очень хорошо.

0 голосов
/ 15 ноября 2018

Вы можете использовать метод RemoveAll из списка.Затем вы указываете предикат, который проверяет словарь (который представляет собой набор KeyValuePair<TKey, TValue>):

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

Или, как это предложено Тимом Шмельтером :

items.RemoveAll(dict => dict.TryGetValue("MyId", out object value) && (value as string) == "A");
0 голосов
/ 15 ноября 2018

Вам нужно сделать что-то вроде:

itemsToRemove = items.Where(x => x.ContainsKey("MyId") && x["MyId"].ToString() == value);
0 голосов
/ 15 ноября 2018

Из вашего описания вам, кажется, нужен первый словарь, содержащий ключ со значением из параметра value. Это было бы items.FirstOrDefault(x => x.ContainsKey(value))

То, что вы делаете, - это получение словаря, содержащего один предопределенный ключ "myId", а затем просмотр объектов внутри словаря и сравнение их значений с параметром value, который вы не описали, как вы хотели.

Если вы ожидаете, что больше словарей будут содержать данный ключ, и вы хотите удалить все из них, вам следует использовать list.RemoveAll(dict => dict.ContainsKey(value))

0 голосов
/ 15 ноября 2018

Вы хотите удалить все с ключом и значением?Вам даже не нужно 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...