LINQ在结果中设置限制

时间:2014-02-25 21:44:51

标签: c# linq limit

我有一个整数列表:

 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

注意:响应时间是返回结果的主要因素。

1 个答案:

答案 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);