C System.Linq.Lookup类删除和添加值

C System.Linq.Lookup类删除和添加值,linq,c#-3.0,linq-to-objects,lookup,Linq,C# 3.0,Linq To Objects,Lookup,我使用C中的Lookup类作为基本数据容器,供用户从两个复选框中选择值 Lookup类比使用class Dictionary>容易得多,但是我找不到删除和向Lookup类添加值的方法 我曾想过使用where和the union,但我似乎做不好 提前感谢。不幸的是,查找类的创建是.NET framework内部的。创建查找的方式是通过查找类上的静态工厂方法。这些是: internal static Lookup<TKey, TElement> Create<TSource>

我使用C中的Lookup类作为基本数据容器,供用户从两个复选框中选择值

Lookup类比使用class Dictionary>容易得多,但是我找不到删除和向Lookup类添加值的方法

我曾想过使用where和the union,但我似乎做不好


提前感谢。

不幸的是,查找类的创建是.NET framework内部的。创建查找的方式是通过查找类上的静态工厂方法。这些是:

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);
然而,这些方法是内部的,不供我们使用。lookup类没有任何删除项的方法

添加和删除的一种方法是不断创建新的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);

您可以不使用LookUp类,只需使用

var dictionary = new Dictionary<string, List<A>>(); 
其中A是要映射到键的对象类型。
我相信您知道如何将匹配对象组添加和删除到特定键:

为什么不创建自己的查找实现呢?以字典为基础,不应该超过几行代码。这里有点同意leppie的观点。lookup类仅用于查找数据,而不是修改数据。另外,字典也不难使用,只需在字典上写一个包装器就可以了。查找也有一种不同的机制来对字典进行实际的查找。但是通过一些简单的测试,它们都执行得非常快。我发现使用查找比使用字典更容易,但我想编写自己的包装器会让事情变得更容易。@Leppie创建自己的结构的想法很好,但字典与查找不兼容,因为查找特别允许使用具有相同值的多个键,元组列表会更好删除工作,你能告诉我如何将项目添加到查找列表中吗。请让我知道是否可以在内部列表中添加和删除项目。刚刚添加的,请让我知道您的想法。非常感谢。我想从内部列表中删除数据的过程很容易,因为现在我在ToLookup方法调用之前有一个列表。!琴键,琴键是非常糟糕的练习,只要说真的,为什么是糟糕的练习?什么意思?说实话?谢谢。在我看来,.net Lookup类是非常无用的,因为它是不可变的。@JasonCheng-Lookup表在查询操作上提供了显著的性能提升,即使与哈希表字典相比也是如此。这两种方法在创建/索引过程中具有相当的性能。因此,在任何情况下,查询比变异或索引多个键都要多的情况下,查找非常有用。查找还具有未注册键返回空集合而不是KeyNotFoundException或空引用的优点。因此,对与候选密钥相关联的集合进行foreach总是安全的。更简单的代码。