2015-10-02 2 views
0

Панайотис Канавос введены следующие умные решения для получения LetterNumberNumber шаблон в этом SOF вопрос: For loop when the values of the loop variable is a string of the pattern LetterNumberNumber?Как указать нерегулярный курс в Перечисляемый в C#?

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);  
}  

А01 А02 А03 В01 В02 В03 С01 С02 С03 D01 D02 D03

Есть ли способ инструктировать нерегулярный курс в Перечислимых материалах? «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) «кажется странным. Я не уверен, что это за образец. Если последний элемент не является опечаткой, то начиная с одного и увеличивая на 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.

 Смежные вопросы

  • Нет связанных вопросов^_^