2012-01-18 5 views
4

У меня есть список, который только 1 строка первоначально как таковой:Создать список с 2 колонками, используя Еогеасп

One 
    Two 
    Three 
    Four 
    Five 
    Six 
    Seven 

Я бы тогда следующее в списке - обратите внимание, как у меня есть 2 колонки - первый столбец для нечетного числа, второй столбец для четного числа:

One  Two 
    Three Four 
    Five Six 
    Seven 

Я пытаюсь следующее:

foreach(var item in mod) 
{ 
    int i = 0; 

    i = i + 1; 
    if (i % 2 == 0) 
    {     
     //add to list here for even number 
    } 

    if (i % 2 != 0) 
    { 
     // add to list here for odd number 
    } 
} 
+3

Итак, в чем ваш вопрос? – Brandon

+1

Вы можете заменить оператор 2nd if инструкцией else. –

+1

Каков ваш вопрос? – diggingforfire

ответ

2

Я предлагаю LINQ:

var odds = mod.Where((item, index) => index % 2 == 0).ToList(); 
var evens = mod.Where((item, index) => index % 2 == 1).ToList(); 
+0

Но это два прохода через входной список, а не один. Хотя это не очень важно для этого небольшого набора данных, это повлияло бы на производительность, если список ввода был большим. – ChrisF

+0

Разве вы не повторяете эту коллекцию дважды? –

+1

Правда, но до тех пор, пока мы не узнаем, что размер достаточно велик, чтобы гарантировать это, я предпочитаю простоту кода по скорости. – tzaman

1

Как о :

int i = 0; 
foreach(var item in mod) //I assume 'mod' is a collection of ints? 
{    
    if (i % 2 == 0) 
    { 
     //Do something with 'item'. 
    } 
    else 
    { 
     //Do something else with 'item'. 
    } 

    i++; 
} 
1

Основываясь на ваш последний вопрос, я предполагаю, что вы хотите сделать это:

int i = 0; 
foreach(var item in mod) 
{ 
    .. 
    // rest of foreach loop here 
} 
1

Вы можете создать два списка и хранить номера в зависимости от их типа:

List<int> OddNumbers = new List<int>(); 
List<int> EvenNumbers = new List<int>(); 

затем выполните следующие действия:

  foreach(var item in mod) 
     { 
      if (item % 2 == 0) 
      {     
       EvenNumbers.Add(item); 
      } 
      else 
      { 
       OddNumbers.Add(item); 
      } 
     } 
+0

Удостоверьтесь, что все номера будут нечетными в вашем примере кода. –

2

Вы i повторного объявления каждый раз. Переместите объявление за пределы foreach.

List<int> even = new List<int>(); 
List<int> odd = new List<int>(); 

int i = 0; 
foreach (var item in mod) 
{ 
    i = i + 1; 
    if (i % 2 == 0) 
    { 
     even.Add(i); 
    } 
    else 
    { 
     odd.Add(i); 
    } 
} 
1

Вот исправленная версия вашего algoryth, что фиксирует тот факт, что вы будете непрестанно быть сравнивая значение = 1, потому что ваша декларация междунар я был в петле

int i = 0; 
    foreach(var item in mod) 
    { 
     i++; 
     if (i % 2 == 0) 
     {     
      //add to list here for even number 
     } 
     else 
     { 
      // add to list here for odd number 
     } 
    } 
2

Предыдущая ответ имел ошибку:

static void Main(string[] args) 
    { 
     var mod = new string[] { "One", "Two", "Three", "Four", "Five", "Six", "Seven" }; 

     var OddNumbers = new List<string>(); 
     var EvenNumbers = new List<string>(); 
     int i = 0; 
     foreach (var item in mod) 
     { 

      i = i + 1; 
      if (i % 2 == 0) 
      { 
       EvenNumbers.Add(item); 
      } 
      else 
      { 
       OddNumbers.Add(item); 
      } 
     } 
} 

     // but when you use an index in your loop I find it more readable to use this 
     for (var j = 0; j < mod.Length; ++j) 
     { 
      if (j % 2 == 0) 
       OddNumbers.Add(mod[j]); 
      else 
       EvenNumbers.Add(mod[j]); 
     } 
1

Простой bool будет достаточно.

var odds = new List<string>(); 
var evens = new List<string>(); 

bool odd = true; 
foreach (var item in new[] {"one", "two", "three", "four"}) 
{ 
    if (odd) 
     odds.Add(item); 
    else 
     evens.Add(item); 

    odd = !odd; 
} 
1

Если вам нужен список с двумя столбцами, вы можете использовать кортежи, подобные этому.

  List<Tuple<List<int>, List<int>>> listTest = new List<Tuple<List<int>, List<int>>>(); 

      List<int> evenNumber = new List<int>(); 
      List<int> oddNumber = new List<int>(); 

      int i = 0; 

      foreach (var item in mod) 
      { 

       if (i % 2 == 0) 
       { 
        //add to list here for even number 
        evenNumber.Add(i);      
       } 

       if (i % 2 != 0) 
       { 
        // add to list here for odd number 
        oddNumber.Add(i); 
       } 

       i++; 
      } 
      listTest.Add(Tuple.Create(oddNumber, evenNumber)); 
Смежные вопросы