如何在c#中讲授不规则的Enumerable课程

本文关键字:不规则 Enumerable 课程 | 更新日期: 2023-09-27 18:15:51

Panagiotis Kanavos介绍了以下聪明的解决方案来产生LetterNumberNumber模式在这个sofsofquestion: For循环时,循环变量的值是一个字符串的模式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);    
}    

A01A02A03B01B02B03C01二氧化碳C03D01D02D03

有办法在可数的东西上指导不定期课程吗?"可点数的。Range(1, maxNumbers)" leading 01, 02,…",99(对于maxnumber99)。

限制例子:
1. 限制(99年01、02、……)只(01、03、05、07年09年11、13)
2. 限制(99年01、02、……)只(02、04、06、08年10)
3.limit(01,02,…,99)only to (01,04,09,10)

我做了什么:
我用了"enumerable",尝试了它的方法:Enumerable.Contains(1,3,5,7,9,13)给出了很大的错误,我无法达到:
A01, a03, a05, ....,Z09, Z11, Z13.

如果enumable不适合这种类型的工作,你会提供什么来处理这个问题?

如何在c#中讲授不规则的Enumerable课程

这不是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]

在我看来,您希望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