代码之家  ›  专栏  ›  技术社区  ›  dan-gph

查找点是什么?

  •  136
  • dan-gph  · 技术社区  · 15 年前

    msdn解释了如下查找:

    Lookup<TKey, TElement> 类似于 Dictionary<TKey, TValue> . 区别在于 字典<tkey,tvalue> 将键映射到单个值,而 查找<tkey,电话> 将键映射到值集合。

    我觉得这个解释没有什么特别的帮助。查找的用途是什么?

    5 回复  |  直到 6 年前
        1
  •  197
  •   Gennady Vanin Геннадий Ванин Mikael Svenson    12 年前

    这是一个介于 IGrouping 还有一本字典。它允许您按一个键将项目分组在一起,但随后以一种有效的方式通过该键访问它们(而不仅仅是对所有项目进行迭代,这就是 GroupBy 让你这样做。

    例如,可以加载.NET类型并按命名空间生成查找…然后非常容易地访问特定命名空间中的所有类型:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Xml;
    
    public class Test
    {
        static void Main()
        {
            // Just types covering some different assemblies
            Type[] sampleTypes = new[] { typeof(List<>), typeof(string), 
                                         typeof(Enumerable), typeof(XmlReader) };
    
            // All the types in those assemblies
            IEnumerable<Type> allTypes = sampleTypes.Select(t => t.Assembly)
                                                   .SelectMany(a => a.GetTypes());
    
            // Grouped by namespace, but indexable
            ILookup<string, Type> lookup = allTypes.ToLookup(t => t.Namespace);
    
            foreach (Type type in lookup["System"])
            {
                Console.WriteLine("{0}: {1}", 
                                  type.FullName, type.Assembly.GetName().Name);
            }
        }
    }
    

    (我通常使用 var 对于这些声明中的大多数,使用普通代码。)

        2
  •  56
  •   Ian Kemp    6 年前

    一种思考方法是: Lookup<TKey, TElement> 类似于 Dictionary<TKey, Collection<TElement>> .基本上,可以通过同一个键返回零个或多个元素的列表。

    namespace LookupSample
    {
        using System;
        using System.Collections.Generic;
        using System.Linq;
    
        class Program
        {
            static void Main(string[] args)
            {
                List<string> names = new List<string>();
                names.Add("Smith");
                names.Add("Stevenson");
                names.Add("Jones");
    
                ILookup<char, string> namesByInitial = names.ToLookup((n) => n[0]);
    
                // count the names
                Console.WriteLine("J's: {0}", namesByInitial['J'].Count()); // 1
                Console.WriteLine("S's: {0}", namesByInitial['S'].Count()); // 2
                Console.WriteLine("Z's: {0}", namesByInitial['Z'].Count()); // 0, does not throw
            }
        }
    }
    
        3
  •  20
  •   jwg    11 年前

    一次使用 Lookup 可能是反向 Dictionary .

    假设有一个电话簿实现为 词典 以一串(唯一)名称作为键,每个名称都与一个电话号码关联。但是两个名字不同的人可能共用同一个电话号码。这对一个 词典 ,这并不关心两个键对应相同的值。

    现在您需要一种方法来查找给定电话号码属于谁。你建造一个 查找 ,添加所有 KeyValuePairs 从您的 词典 ,但向后,以值为键,以键为值。现在,您可以查询电话号码,并获取其电话号码为的所有人的姓名列表。建筑A 词典 使用相同的数据会丢弃数据(或者失败,取决于您是如何做的),因为

    dictionary["555-6593"] = "Dr. Emmett Brown";
    dictionary["555-6593"] = "Marty McFly";
    

    意味着第二个条目将覆盖第一个条目-不再列出文档。

    尝试以稍微不同的方式写入相同的数据:

    dictionary.Add("555-6593", "Dr. Emmett Brown");
    dictionary.Add("555-6593", "Marty McFly");
    

    会在第二行引发异常,因为您不能 Add 已经在 词典 .

    [当然,您可能希望使用其他单个数据结构在两个方向进行查找等。此示例意味着您必须重新生成 查找 词典 每当后者发生变化时。但对于某些数据,这可能是正确的解决方案。]

        4
  •  13
  •   Daren Thomas    15 年前

    我以前没有成功地使用过它,但我要做的是:

    Lookup<TKey, TElement> 其行为类似于没有唯一约束的表上的(关系)数据库索引。在你将要使用另一个的地方使用它。

        5
  •  5
  •   David Andres    15 年前

    我想你可以这样说:假设你正在创建一个数据结构来保存电话簿的内容。您需要输入姓氏,然后输入名字。在这里使用字典是很危险的,因为许多人可以同名。所以字典最多只能映射到一个值。

    查找将映射到可能的多个值。

    查找[史密斯][约翰]将是一个10亿大小的集合。