2014-11-12 5 views
1

Я пытаюсь связать два значения списка в один список на основе значений столбца.Объединить значения списка на основе столбца C#

Ниже приведен список, получающий его.

TestCaseName Screen IEStatus  IEPath  FFStatus FFPath  GCStatus  GCPath 
-------------------------------------------------------------------------------------------- 
TC001  Yes  Pass  C:\\a.jpg  null   null  null   null 
TC002  Yes  Pass  C:\\b.jpg  null   null  null   null 
TC001  Yes  null   null  Pass  C:\\c.jpg  null   null 
TC002  Yes  null   null  Pass  C:\\d.jpg  null   null 

Но я хочу, чтобы объединить значения и отображение, как показано ниже

TestCaseName Screen IEStatus  IEPath  FFStatus FFPath  GCStatus  GCPath 
-------------------------------------------------------------------------------------------- 
TC001  Yes  Pass  C:\\a.jpg  Pass  C:\\c.jpg  null  null 
TC002  Yes  Pass  C:\\b.jpg  Pass  C:\\d.jpg  null  null 

Ниже мой код

 List<ResultProperties> lstCommon = new List<ResultProperties>(); 
    List<ResultProperties> lstNew= new List<ResultProperties>(); 
    var checked_boxes = this.Controls.OfType<CheckBox>().Where(c => c.Checked); 
    foreach (CheckBox cbx in checked_boxes) 
    { 
     Program obj = new Program();    
     lstNew = obj.PerformTest(cbx.Text, textBox1.Text);       
     foreach (ResultProperties item in lstNew) 
     { 
      lstCommon.Add(item); 
     } 
    } 

Любые предложения будут очень полезны ..

ответ

1

Вместо того, чтобы делать это в одном выражении Linq, я бы, вероятно, сделать список что-то об этом, с тем, чтобы избежать многочисленных итераций по сравнению с данными источника:

List<ResultProperties> a = LoadSourceList() ; 

IEnumerable<IGrouping<string,ResultProperties> groups = 
    a 
    .GroupBy(x => x.TestCaseName , StringComparer.OrdinalIgnoreCase) 
    ; 

List<ResultProperties> coalesced = new List<ResultProperties>() ; 

foreach(IGrouping<string,ResultProperties> group in groups) 
{ 
    ResultProperties item = null ; 

    foreach(ResultProperty rp in group) 
    { 
    item   = item   ?? rp   ; 
    item.Screen = item.Screen ?? rp.Screen ; 
    item.IEStatus = item.IEStatus ?? rp.IEStatus ; 
    item.IEPath = item.IEPath ?? rp.IEPath ; 
    item.FFStatus = item.FFStatus ?? rp.FFStatus ; 
    item.FFPath = item.FFPath ?? rp.FFPath ; 
    item.GCStatus = item.GCStatus ?? rp.GCStatus ; 
    item.GCPath = item.GCPath ?? rp.GCPath ; 
    } 

    coalesced.Add(item) ; 

} 

В конце дня, список источников не имеет значения, и coalesced должен содержать один ResultProperties для каждого отдельного имени тестового примера, при этом все значение коалесцируется по стратегии первого выигрыша (первое непустое значение для свойства определяет свойство для группы).

1

Вы должны можете сделать это с помощью GroupBy, например:

var res = testData 
    .GroupBy(test => test.TestCaseName) 
    .Select(g => new ResultProperties { 
     TestCaseName = g.Key 
    , Screen = g.Select(test => test.Screen).FirstOrDefault() 
    , IEStatus = g.Select(test => test.IEStatus).FirstOrDefault() 
    , IEPath = g.Select(test => test.IEPath).FirstOrDefault() 
    , FFStatus = g.Select(test => test.FFStatus).FirstOrDefault() 
    , FFPath = g.Select(test => test.FFPath).FirstOrDefault() 
    , GCStatus = g.Select(test => test.GCStatus).FirstOrDefault() 
    , GCPath = g.Select(test => test.GCPath).FirstOrDefault() 
    }).ToList(); 

Идея состоит в том, чтобы сформировать группы, основанные на имени теста, а затем захватить первую непустую запись для каждого атрибута в группе.

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