C # System.Linq.Lookup Class Удаление и добавление значений - PullRequest
12 голосов
/ 27 октября 2010

Я использую класс Lookup в C # в качестве основного контейнера данных, чтобы пользователь мог выбирать значения из двух полей Проверяемого списка.

Класс Lookup гораздо проще в использовании, чем использование класса Dictionary>, однакоЯ не могу найти методы для удаления и добавления значений в класс поиска.

Я думал об использовании оператора where и объединения, но я не могу понять, как это правильно.

Заранее спасибо.

Ответы [ 2 ]

14 голосов
/ 27 октября 2010

К сожалению, создание класса Lookup является внутренним для платформы .NET. Способ создания поиска осуществляется через статические фабричные методы в классе Lookup. Это:

internal static Lookup<TKey, TElement> Create<TSource>(IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer);
    internal static Lookup<TKey, TElement> CreateForJoin(IEnumerable<TElement> source, Func<TElement, TKey> keySelector, IEqualityComparer<TKey> comparer);

Однако эти методы являются внутренними и не предназначены для потребления нами. Класс поиска не имеет возможности удалять элементы.

Одним из способов добавления и удаления является постоянное создание новых ILookups. Например - как удалить элемент.

public class MyClass
{
  public string Key { get; set; }
  public string Value { get; set; }
}

//We have a fully populated set:
var set = new List<MyClass>() //Populate this.
var lookup = set.ToLookup(m => m.Key, m => m);

//Remove the item where the key == "KEY";
//Now you can do something like that, modify to your taste.
lookup = lookup
  .Where(l => !String.Equals(l.Key, "KEY"))
   //This just flattens the set - up to you how you want to accomplish this
  .SelectMany(l => l)
  .ToLookup(l => l.Key, l => l.Value);

Для добавления в список мы могли бы сделать что-то вроде этого:

//We have a fully populated set:
var set = new List<MyClass>() //Populate this.
var lookup = set.ToLookup(m => m.Key, m => m);

var item = new MyClass { Key = "KEY1", Value = "VALUE2" };

//Now let's "add" to the collection creating a new lookup
lookup = lookup
  .SelectMany(l => l)
  .Concat(new[] { item })
  .ToLookup(l => l.Key, l => l.Value);
2 голосов
/ 21 февраля 2019

Что вы можете сделать вместо использования класса LookUp, это просто использовать это

var dictionary = new Dictionary<string, List<A>>(); 

, где A - тип объекта, который вы хотите сопоставить с ключом.Я надеюсь, вы знаете, как добавить и удалить группу подходящих объектов для определенного ключа.:)

...