咨询区
dan-gph:
MSND 上对 Lookup 做了如下的解释。
Lookup<TKey, TElement>
类似于 Dictionary<TKey,TValue>
, 不同点在于 Dictionary<TKey, TValue>
中的key对应的是单个value,而 Lookup<TKey, TElement>
中的 key 对应的是一个 value集合
。
我觉得这个解释等于没解释,请问 Lookup
的用途在哪里?
回答区
bobbymcr:
你可以把 Lookup<TKey, TElement>
和 Dictionary<TKey, Collection<TElement>>
看作是等价的,很明显后者通过 key 可以返回与之匹配的 list 集合。
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 namesConsole.WriteLine("J's: {0}", namesByInitial['J'].Count()); // 1Console.WriteLine("S's: {0}", namesByInitial['S'].Count()); // 2Console.WriteLine("Z's: {0}", namesByInitial['Z'].Count()); // 0, does not throw}}
}
点评区
相信很多人对 Lookup
不是很理解,我初学时也没搞特别清楚,真不知道 Lookup
是出自哪里的术语,不过没关系,没听过 Lookup
,总听过 GroupBy
吧,对,就是关系型数据库中用到的 group by
,这两者是等价的,只不过又造了一个新名词而已,不信的话,我写个例子给你看看。
static void Main(string[] args){var nums = new int[] { 1, 2, 3, 3 };//使用 lookupILookup<int, int> query = nums.ToLookup(t => t);foreach (IGrouping<int, int> item in query){var key = item.Key;var list = item.ToList();Console.WriteLine($"lookup : key={key}, value={string.Join(",", list)}");}Console.WriteLine($"\r\n -------------- \r\n");//使用 groupIEnumerable<IGrouping<int, int>> query2 = nums.GroupBy(t => t);foreach (IGrouping<int, int> item in query2){var key = item.Key;var list = item.ToList();Console.WriteLine($"groupby : key={key}, value={string.Join(",", list)}");}Console.ReadLine();}
从结果看,两者都做了相同的事情,仔细观察代码,你会发现在 foreach
的迭代项 item
都是 IGrouping<int, int>
类型,接下来就有一个疑问了,query 还能被 foreach 吗?这个要看 ILookup<int, int>
的内部迭代类是怎么写的了,翻一下代码看看。
public class Lookup<TKey, TElement> : IEnumerable<IGrouping<TKey, TElement>>, IEnumerable, ILookup<TKey, TElement>
{public IEnumerator<IGrouping<TKey, TElement>> GetEnumerator(){Grouping g = lastGrouping;if (g != null){do{g = g.next;yield return g;}while (g != lastGrouping);}}
}
看到没有,迭代类返回的类型 IEnumerator<IGrouping<TKey, TElement>>
不正是做 GroupBy 的 query2 类型 IEnumerable<IGrouping<int, int>>
嘛 ~~~
如果你要不懂 sql 的 group by
, 那就当我没说哈 ????????????
原文链接:https://stackoverflow.com/questions/1403493/what-is-the-point-of-lookuptkey-telement