Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找的意义是什么<;TKey,远程通讯>;?_C#_.net_Linq_Lookup - Fatal编程技术网

C# 查找的意义是什么<;TKey,远程通讯>;?

C# 查找的意义是什么<;TKey,远程通讯>;?,c#,.net,linq,lookup,C#,.net,Linq,Lookup,MSDN对查找的解释如下: A 像一个。区别在于 字典将键映射到单个值,而 查找将键映射到值集合 我不觉得这个解释特别有用。查找用于什么?它是i分组和字典的交叉。它允许您通过一个键将项目分组在一起,然后通过该键以高效的方式访问它们(而不仅仅是迭代所有项目,这是GroupBy允许您做的) 例如,您可以加载.NET类型并按命名空间构建查找。。。然后非常容易地访问特定命名空间中的所有类型: using System; using System.Collections.Generic; using Sy

MSDN对查找的解释如下:

A 像一个。区别在于 字典将键映射到单个值,而 查找将键映射到值集合


我不觉得这个解释特别有用。查找用于什么?

它是
i分组
和字典的交叉。它允许您通过一个键将项目分组在一起,然后通过该键以高效的方式访问它们(而不仅仅是迭代所有项目,这是
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);
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Xml;
公开课考试
{
静态void Main()
{
//只是包含一些不同程序集的类型
Type[]sampleTypes=new[]{typeof(List),typeof(string),
typeof(可枚举)、typeof(XmlReader)};
//这些程序集中的所有类型
IEnumerable allTypes=sampleTypes.Select(t=>t.Assembly)
.SelectMany(a=>a.GetTypes());
//按名称空间分组,但可索引
ILookup lookup=allTypes.ToLookup(t=>t.Namespace);
foreach(在查找[“系统”]中键入类型)
{
Console.WriteLine(“{0}:{1}”,
type.FullName,type.Assembly.GetName().Name);
}
}
}

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

我以前没有成功使用过它,但我的目标是:


查找
的行为非常类似于表上的(关系)数据库索引,没有唯一约束。在与另一个相同的位置使用它。

考虑它的一种方式是:
查找
类似于
字典
。基本上,零个或多个元素的列表可以通过同一个键返回

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
        }
    }
}
名称空间查找示例
{
使用制度;
使用System.Collections.Generic;
使用System.Linq;
班级计划
{
静态void Main(字符串[]参数)
{
列表名称=新列表();
名称。添加(“史密斯”);
名称。添加(“史蒂文森”);
名称。添加(“琼斯”);
ILookup namesByInitial=names.ToLookup((n)=>n[0]);
//数一数名字
WriteLine(“J's:{0}”,namesByInitial['J'].Count());//1
WriteLine(“S:{0}”,namesByInitial['S'].Count());//2
WriteLine(“Z的:{0}”,namesByInitial['Z'].Count());//0,不抛出
}
}
}

我想你可以这样说:想象你正在创建一个数据结构来保存电话簿的内容。您希望先按姓氏,然后按姓氏键入。在这里使用字典是危险的,因为许多人可能有相同的名字。因此,字典最多只能映射到一个值

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


查找[“Smith”][“John”]将是一个10亿大小的集合。

使用
查找
可以反转
词典

假设您将电话簿实现为一个
字典
,其中有一组(唯一的)名称作为键,每个名称与一个电话号码关联。但是两个名字不同的人可能共用同一个电话号码。这对于
字典来说不是问题,它不关心两个键是否对应相同的值

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

dictionary["555-6593"] = "Dr. Emmett Brown";
dictionary["555-6593"] = "Marty McFly";
意味着第二个条目覆盖了第一个条目-文档不再列出

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

dictionary.Add("555-6593", "Dr. Emmett Brown");
dictionary.Add("555-6593", "Marty McFly");
将在第二行抛出异常,因为您无法添加
字典中已有的键


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

查找结果中是否有零个元素?你怎么知道的?(就我所知,查找是公开不可变的,我不认为ToLookup会有效地发明密钥。)从技术上讲,是的,因为查找返回一个不存在的密钥的空集合(我编辑了我的帖子,添加了一个代码示例来显示这一点)。阅读答案顺序是jwg->bobbymcr->Jonsketa非常干净和有用的答案,我希望它被选中。我认为为了更好地回答这个问题,你可以更换一些VAR。出于学习目的,我认为当类型表达清楚时,更容易理解。只要我的2美分:)如果它兼备了这两个方面的优点,那么为什么还要麻烦使用字典呢?@KyleBaran:因为这对于真正的键/值对集合来说毫无意义,因为每个键只有一个值。@KyleBaran
Lookup
只是一个不可变的集合(没有针对eg的
Add
方法),它的用途有限。此外,它不是一个通用的集合,因为如果您查找一个不存在的键,您会得到一个空序列,而不是一个异常,这仅在特殊上下文中有意义,例如,对于linq。这与MS没有提供