【问题标题】:Combine list values based on column C#基于列 C# 组合列表值
【发布时间】:2015-01-09 17:06:51
【问题描述】:

我正在尝试根据列的值将两个列表值绑定到一个列表中。

下面是我得到它的列表。

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

任何建议都会很有帮助..

【问题讨论】:

    标签: c# winforms linq list datatable


    【解决方案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,所有值合并在一个先赢策略(第一个非空属性的值定义了组的属性)。

    【讨论】:

      【解决方案2】:

      您应该可以使用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();
      

      想法是根据测试的名称组成组,然后为组中的每个属性获取第一个非空条目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-31
        • 1970-01-01
        • 2018-03-15
        • 1970-01-01
        • 2011-12-20
        • 2018-09-19
        相关资源
        最近更新 更多