2015-10-02 28 views
0

帕納約蒂斯Kanavos引入了以下巧妙的解決產生LetterNumberNumber在該SOF問題模式:For loop when the values of the loop variable is a string of the pattern LetterNumberNumber?如何在C#中的Enumerable中指導不規則的課程?

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 C02 C03 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不適合這種類型的工作,您提供什麼來解決這個問題?

+0

使用範圍來索引到包含所需值的數組。 –

回答

1

這不是C#中的一個直接功能,而是它在F#中。

F#例如:

[1..2..10] 

會產生[1,3,5,7,9]的列表。

你第一個例子中, 「限制(01,02,...,99)只(01,03,05,07,09,11,13)」,可以與

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

實現第二個例子, 「限制(01,02,...,99)只(02,04,06,08,10)」 可與

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

而且你的第三個例子來實現,「限制( 01,02,...,99)僅爲(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]

+0

非常感謝您提供的信息豐富,詳細,非常明確的答案。我試過了,它解決了。許多thx再次。 –

1

這聽起來像你想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

相關問題