有List<DB>
class DB
{
int id { get; set; }
decimal win { get; set; }
decimal credit { get; set; }
}
id win credit
1 10 100
2 12 105
3 9 109
4 11 109
5 5 109
6 4 109
7 3 95
8 2 115
如何使用相同的credit. 假设会有一个变量-n匹配次数连续超过 4 次 (>=)。以下是如何找到这些索引?
在我上面的示例中,它是第 3 到 6 行
作为写在膝盖上的选项之一:
让我解释一下这里发生了什么:
new List<(decimal Credit, Range Range)>- 这一切都取决于您想要的视图。你可以制作一个包含这些数据的类,你可以制作它Dictionary,它会有一个键Range,这对我个人来说更方便)for (int i = 0; i < data.Count; i++)- 一个简单的循环,将给出当前索引(这是我们需要的)。var current = data[i];- 当前对象。var next = i + 1 < data.Count ? data[i+1] : null;是集合中的下一个对象。如果索引在外部,则返回NULL。if (current.Credit == next?.Credit)- 如果当前值和下一个值相等,那么...if (startIdex == -1)- 这样我们就不会在每次迭代时更改起始索引,只有在第一次找到重复值时才会更改其值。else-我认为这里一切都清楚了,如果我们当前的值不与下一个重复,那么我们检查更改startIndex,如果它是标准值-1,那么我们只需添加一个新对象,Range它将是从i到i+1,如果起始索引已更改,则我们将所需的我们Range从添加startIndex到i+1,好吧,重置此索引。所以我们的逻辑是:
Range(стартовыйИндекс, текущий+1)。Range(текущий, текущий+1)。结果,我们会得到这样的东西:
数据本身:
我们看到第 109 个值从索引 2 变为索引 6(请记住 C# 中的索引计数从 0 开始!)。
在这里您可以进行各种其他改进,但我认为您现在了解了本质。也可以自己看输出结果需要哪一个,比如可以不取index(
i),而是id取classdb,我想对你来说应该不难。然后随心所欲地处理这些数据,例如:
PS Range是在 C#8 中添加的。如果由于某种原因这不适合你,那么对不起,你将不得不写你的拐杖。
在线示例