gpt4 book ai didi

c# - LINQ to count 在 int 数组中继续重复项(int)?

转载 作者:太空狗 更新时间:2023-10-29 22:12:30 24 4
gpt4 key购买 nike

这是我的问题的一个场景:我有一个数组,比如:

{ 4, 1, 1, 3, 3, 2, 5, 3, 2, 2 }

结果应该是这样的(数组元素 => 它的计数):

4 => 1
1 => 2
3 => 2
2 => 1
5 => 1
3 => 1
2 => 2

我知道这可以通过for循环来实现。

但是谷歌搜索了很多,希望通过使用 LINQ 的较少行代码来实现这一点,但没有成功。

最佳答案

我认为实现此目的的最佳方法是使用迭代器 block 创建“类似 LINQ”的扩展方法。这允许您对数据执行一次计算。请注意,如果您只想对一小部分数字执行计算,那么性能根本不重要。当然,这实际上是变相的 for 循环。

static class Extensions {

public static IEnumerable<Tuple<T, Int32>> ToRunLengths<T>(this IEnumerable<T> source) {
using (var enumerator = source.GetEnumerator()) {
// Empty input leads to empty output.
if (!enumerator.MoveNext())
yield break;

// Retrieve first item of the sequence.
var currentValue = enumerator.Current;
var runLength = 1;

// Iterate the remaining items in the sequence.
while (enumerator.MoveNext()) {
var value = enumerator.Current;
if (!Equals(value, currentValue)) {
// A new run is starting. Return the previous run.
yield return Tuple.Create(currentValue, runLength);
currentValue = value;
runLength = 0;
}
runLength += 1;
}

// Return the last run.
yield return Tuple.Create(currentValue, runLength);
}
}

}

请注意,扩展方法是通用的,您可以在任何类型上使用它。使用 Object.Equals 比较值是否相等.但是,如果你愿意,你可以传递 IEqualityComparer<T>允许自定义比较值的方式。

你可以使用这样的方法:

var numbers = new[] { 4, 1, 1, 3, 3, 2, 5, 3, 2, 2 };
var runLengths = numbers.ToRunLengths();

对于您输入的数据,结果将是这些元组:

4 1 1 2 3 2 2 1 5 1 3 1 2 2 

关于c# - LINQ to count 在 int 数组中继续重复项(int)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11330064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com