我一直有麻烦关节之间的差异ILookup<TKey, TVal>和IGrouping<TKey, TVal>,并很好奇,如果我理解正确了.LINQ通过生成IGrouping项目序列来复杂化问题,同时也为我提供了ToLookup扩展方法.所以在我仔细观察之前感觉它们是一样的.
var q1 =
from n in N
group n by n.MyKey into g
select g;
// q1 is IEnumerable<IGrouping<TKey, TVal>>
Run Code Online (Sandbox Code Playgroud)
这相当于:
var q2 = N.GroupBy(n => n.MyKey, n => n);
// q2 is IEnumerable<IGrouping<TKey, TVal>>
Run Code Online (Sandbox Code Playgroud)
这看起来很像:
var q3 = N.ToLookup(n => n.MyKey, n => n);
// q3 is ILookup<TKey, TVal>
Run Code Online (Sandbox Code Playgroud)
我在以下类比中是否正确?
IGrouping<TKey, TVal>是一个单独的组(即键控序列),类似于KeyValuePair<TKey, TVal>值实际上是一系列元素(而不是单个元素)IEnumerable<IGrouping<TKey, TVal>>是那些序列(类似于迭代时得到的结果)IDictionary<TKey, TVal>ILookup<TKey, TVal>更像是一个IDictionary<TKey, …我有一个约9000个产品的列表,其中一些可能有重复.
我想用产品序列号作为密钥来制作这些产品的HashTable,这样我就可以轻松找到重复的产品.
如何在C#/ .NET中使用HashTable?HashSet会更合适吗?
最终我想要一个像这样的列表:
Key-Serial:11110 - 包含:Product1
Key-Serial:11111 - 包含:Product3,Product6,Product7
Key-Serial:11112 - 包含:Product4
Key-Serial:11113 - 包含:Product8,产品9
所以,我有一个所有产品的列表,它们按照具有重复序列号的产品进行分组.这样做的"正确"方法是什么?
说我有一个List<string> listOfStrings,我想根据某些谓词将此列表分为两个列表。例如,第一个列表应包含所有以字母开头的字符串,第二个列表则为不包含字母的列表。
现在,我将这样做:
var firstList = listOfStrings.Where(str => predicate(str));
var secondList = listOfStrings.Where(str => !predicate(str));
Run Code Online (Sandbox Code Playgroud)
有没有一种更好的方法可以做到这一点?
我有一些LINQ代码(unfortunatley不要手工!)从列表对象中获取重复项.但是,原始列表中的重复项是这样的:
Item A
Item A
Item A
Item B
Item B
Item C
Item C
Item C
Item C
etc...
Run Code Online (Sandbox Code Playgroud)
我想做的是扩展LINQ查询以获取所有这些重复实例,而不仅仅是重复对中的第一个实例,或三重奏.
什么是理想的查询来获得这个?