2014-11-19 3 views
0

Am имеющий список студентов и при условии, что мне нужно скопировать одну строку и добавить эту строку с незначительными изменениямиC# - Genereic Список скопировать одну строку добавить еще одну строку

, например:

Класс Студент, имеющий follwing свойства

public class Student 
{  
    public int Id { get; set; }  
    public string Name { get; set; } 
    public string Section { get; set; } 
    public int Marks { get; set; } 
} 

Таким образом, хотя Перебор списка, если знаки = 90 мне нужно скопировать эту строку и добавить еще одну строку, обновляя раздел

foreach (var item in studentData) 
{ 
    if(item.Section == 90) 
    { 
     //I need add some logic and update section and copy this item fully 
     //Add this modified item as new item to studentData 
    } 
} 

Если класс студент имел 3 пунктов первоначально

1 "Sam" "A" 48 
1 "John" "B" 68 
1 "Broad" "A" 90 

мой ожидаемый результат будет

1 "Sam" "A" 48 
1 "John" "B" 68 
1 "Broad" "A" 90 
1 "Broad" "C" 90 


//Where i added one more row modifying the section 

Что будет самый простой способ сделать это без особого цикла? я застрял !!

Я считаю, что вопрос по крайней мере с примером!

Благодаря

+0

, что вы имеете в виду скопировать? если логика верна? вы хотите, чтобы 'item' был добавлен в' studentData' после обновления значения 'item.section'? вы не можете изменить коллекцию, в которой вы выполняете итерацию в цикле foreach –

+0

@DGibbs да, обновление ... но я не уверен, как добавить элемент снова как новую строку. обновил мой вопрос с примера – Peru

+1

Вам действительно нужно «скопировать и добавить»? Так, например, у вас есть один «Студент» с «Id == 1» в вашем списке, вы хотите, чтобы в итоге получилось * two * 'Student's с' Id == 1'? И что именно вы тестируете? Вы говорите, что хотите проверить, есть ли «отметки = 90», но ваш код предполагает, что вы тестируете 'Section == 90'. – Corak

ответ

1

Вы не можете добавлять элементов в коллекцию вы перебор, так просто создать еще один список, добавить свои копии к нему и в конце добавить элементы из этого списка к вашим studentData.

Что-то вроде этого:

var copies = new List<Student>(); 

foreach (var item in studentData) 
{ 
    if(item.Section == 90) 
    { 
     var copy = new Student(); 
     copy.ID = item.ID; 
     copy.Name = item.Name; 
     copy.Marks = item.Marks; 
     copy.Section = // your updates to section 
     copies.Add(copy); 
    } 
} 

studentData.AddRange(copies); 
+1

Или вы могли бы перепрограммировать копию исходного списка, например. 'foreach (элемент var в studentData.ToList()) 'и добавить к оригиналу внутри цикла – DGibbs

1

Если вы действительно хотите, чтобы дублировать Student с (так как я не уверен, если это хороший дизайн), вы можете использовать следующие LINQ запрос:

list = list.AddRange(list.Where(x => x.Section == 90) 
         .Select(x => new Student() 
             { 
             // here set fields as you wish 
             })); 

где в конструкторе вы можете создать нового пользователя соответственно.

1

Возможно, вы должны изменить структуру данных. Думайте объекты, а не строки таблицы.

Например:

public class Student 
{  
    public int Id { get; set; }  
    public string Name { get; set; } 
    public List<Grade> Grades { get; set; } 
} 

public class Grade 
{  
    // Something 
} 
+1

Перефразировать фильмы Бэтмена: это не тот ответ, о котором просил OP, но, вероятно, нужен один OP. - Особенно: «Думайте объекты, а не строки таблицы». – Corak

+1

@Corak Я делаю все, что могу, чтобы спасти этот темный город от ужасных методов кодирования: P – Svish

0
 for (int i = 0; i< studentData.Count; i++) 
     { 
      var item = studentData[i]; 
      if (item.Marks == "90") 
      {      
       studentData.Insert(i, new Student { Id = item.Id, Name = item.Name + "(smart one)", Section = item.Section, Marks = item.Marks});      
       i++; 
      } 
     } 
Смежные вопросы