Класс С# System.Linq.Lookup Удаление и добавление значений

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

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

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

Спасибо заранее.

Ответ 1

К сожалению, создание класса Lookup является внутренним для платформы .NET. Способ создания поиска осуществляется через static Factory Методы класса 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);

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

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

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 "add" to the collection creating a new lookup
lookup = lookup
  .SelectMany(l => l)
  .Concat(new[] { item })
  .ToLookup(l => l.Key, l => l.Value);