如何在C#中指导Enumerable中的不规则课程?

How to instruct irregular course in Enumerable in C#?

Panagiotis Kanavos 在这个 SOF 问题中引入了以下聪明的解决方案来生成 LetterNumberNumber 模式:

var maxLetters=3; // Take 26 for all letters    
var maxNumbers=3; // Take 99 for all the required numbers   

var values=from char c in Enumerable.Range('A',maxLetters).Select(c=>(char)c)    
       from int i in Enumerable.Range(1,maxNumbers)    
       select String.Format("{0}{1:d2}",(char)c,i);    

foreach(var value in values)    
{    
    Console.WriteLine(value);    
}    

A01 A02 A03 B01 B02 B03 C01 二氧化碳 二氧化碳 D01 D02 D03

有没有办法在Enumerable的东西上指导不规则的课程? "Enumerable.Range(1, maxNumbers)" 引导 01、02、...、99(对于 maxNumbers 99)。

限制示例:
1. 将 (01,02,...,99) 限制为 (01,03,05,07,09,11,13)
2. 将 (01,02,...,99) 限制为 (02,04,06,08,10)
3. 将 (01,02,...,99) 限制为 (01,04,09,10)

我做了什么:
我工作 "Enumarable",尝试了它的方法,如:Enumerable.Contains(1,3,5,7,9,13) 给出了很大的错误,我无法达到:
A01, A03, A05, ....,Z09, Z11, Z13.

如果 Enumarable 不适合这类工作,你会提供什么来解决这个问题?

在我看来,您希望 Enumerable.Range(1, maxNumbers) 受特定条件的限制,而不是拥有所有整数。由于 Enumerable.Range() 生成 IEnumerable<int>,您可以链接任何 LINQ 过滤方法调用,即 Enumerable.Where() 方法。例如,Enumerable.Range(1, 99).Where(x => x % 3 == 0) 会产生 (3,6,9,...99).

如果您只想要您指定的特定情况,其中列表仅包含 (1,3,5,7,9,13),您可以简单地制作一个包含所需数字的列表:new List<int> {1,3,5,7,9,13};你也可以使用 Enumerable.Range(1, maxNumbers).Where(x => x % 2 == 1)maxNumbers = 13.

这不是 C# 中的直接功能,而在 F# 中。

F# 示例:

[1..2..10]

将生成 [1,3,5,7,9] 的列表。

你第一个例子,"Restrict (01,02,...,99) only to (01,03,05,07,09,11,13)"可以用

实现
Enumerable.Range(1,99).Where(x => x % 2 == 1).Take(7);

第二个例子,"Restrict (01,02,...,99) only to (02,04,06,08,10)"可以用

实现
Enumerable.Range(1,99).Where(x => x % 2 == 0).Take(5);

而您的第三个示例 "Restrict (01,02,...,99) only to (01,04,09,10)" 似乎很奇怪。我不确定这里的模式是什么。如果最后一个元素不是错字,那么从1开始,递增3,然后递增5,然后递增1,看起来不清楚,但这里有一个方法可以完成。

public static IEnumerable<int> GetOddMutation(int start, int max, int count, List<int> increments) {
    int counter = 0;
    int reset = increments.Count - 1;
    int index = 0;
    int incremented = start;
    while(counter < count) {
        var previous = incremented;
        incremented += increments[index];
        index = index == reset ? 0 : index + 1;
        counter++;
        if(previous != incremented) //Avoid duplicates if 0 is part of the incrementation strategy. Alternatively, call .Distinct() on the method.
        yield return incremented;
    }
}

调用

GetOddMutation(1,99,4, new List<int> {0,3,5,1})

将导致 [1,4,9,10]