我有一个整数列表:
List<int> a = new List<int>();
a.Add(1001);
a.Add(1001);
a.Add(1001);
a.Add(1001);
a.Add(2003);
a.Add(2003);
a.Add(2003);
我需要在此列表上执行LINQ“Where”,并且只返回(或限制)每种类型的整数2。 所以结果应该是:
1001
1001
2003
2003
注意:响应时间是返回结果的主要因素。
答案 0 :(得分:7)
按项目的值对项目进行分组,然后从每个组中选择前两项:
var result = a.GroupBy(i => i).SelectMany(g => g.Take(2));
或查询语法(在这种情况下不太美观):
var result = from i in a
group i by i into g
from i in g.Take(2)
select i;
因此,分组将对所有项目进行分组,然后只返回结果,您可以编写自定义扩展方法,这将不包含所有项目组(将使用更少的内存)并以流方式返回项目,因为它们来自来源序列:
public static IEnumerable<T> LimitElementOccurences<T>(
this IEnumerable<T> source, int n)
{
return source.GoodMethodName(n, t => t);
}
public static IEnumerable<T> LimitElementOccurences<T, TKey>(
this IEnumerable<T> source, int n, Func<T, TKey> keySelector)
{
var stats = new Dictionary<TKey, int>();
foreach (var item in source)
{
var key = keySelector(item);
int returnedItemsCount;
if (!stats.TryGetValue(key, out returnedItemsCount))
{
yield return item;
stats.Add(key, 1);
continue;
}
if (returnedItemsCount >= n)
continue;
yield return item;
stats[key] = returnedItemsCount + 1;
}
}
用法是(对不起,无法想象好的方法名称)
var result = a.LimitElementOccurences(2);