C# - 按顺序计算数字中出现的数字

时间:2017-02-26 16:42:18

标签: c#

给定数组{ 1,1,1,2,2,1,1,1,2 }

我正在努力找到一种方法来按照它们出现的顺序对这些数字进行分组。无法修改原始数组的顺序。

我正在寻找的输出是:{ 3, 2, 3, 1 }

我感谢我能得到的任何帮助!

3 个答案:

答案 0 :(得分:1)

您可以快速完成此操作,但请注意它会利用副作用,而GroupBy会使其在计算批次之前迭代整个集合。

var arr = new[] { 1,1,1,2,2,1,1,1,2 };
int lastValue = arr.First();
int groupKey = 0;
var occurrences = arr
    .GroupBy(x => lastValue == (lastValue = x) ? groupKey : ++groupKey)
    .Select(x => x.Count())
    .ToArray(); 
// occurrences = {3,2,3,1}

为了方便和更有效地重用,您可以编写一个扩展方法,该方法可以处理几乎无限的整数枚举(它按批次计算批次):

public static IEnumerable<int> BatchCount(this IEnumerable<int> source)
{
    using(var e = source.GetEnumerator())
    {
        if(!e.MoveNext())
            yield break;

        var lastItem = e.Current;
        int currentCount = 1;

        while(e.MoveNext())
        {
            if(e.Current == lastItem)
                currentCount++;
            else
            {
                yield return currentCount;
                currentCount = 1;
                lastItem = e.Current;
            }
        }

        yield return currentCount;
    }
}

并使用它:

var occurrences = arr.BatchCount();
// occurrences = {3,2,3,1}

答案 1 :(得分:0)

使用linq,

var result = arr.Select((item, index) =>
                        new
                        {
                               Count = (index == 0 || arr.ElementAt(index - 1) != item)
                                ? arr.Skip(index).TakeWhile(d => d == item).Count()
                                : -1
                        }
                           )
                   .Where(d => d.Count != -1);

答案 2 :(得分:0)

因此,Microsoft provide a robust ChunkBy extension method用于分组 连续 项目。您可以像这样使用它:

response.sendRedirect(request.getParameter("from"));

IMO,它应该被添加到BCL(它不是)

足够方便

供参考,以下是实施:

myArray.ChunkBy(x => x).Select(g => g.Count())