使用group by从一个集合中选择第一个结果,然后添加到另一个集合中

时间:2015-12-25 03:12:03

标签: linq collections

我有2个集合,我遇到问题是通过使用LINQ查询将数据从一个集合添加到另一个集合。

第一个集合类MyTestCase对象具有带有时间戳的每台计算机的测试用例结果列表。一台机器来自另一个集合TestResultsInfo的一个或多个测试用例。另外,测试用例结果是多个实例,结果为通过或失败。

我创建了LINQ查询以实现此目的,但看起来更加硬编码,如果没有任何测试的测试用例结果,它会抛出异常。

你能告诉我指针。

public class MyTestCase
{
     public string MachineName { get; set; }

    public string TestName { get; set; }

    public string Result { get; set; }

    public string TimeStamp { get; set; }
}


public class TestResultsInfo
{
    public int ID { get; set; }

    public string MachineName { get; set; }

    public string Test1 { get; set; }

    public string Test2 { get; set; }

    public string Test3 { get; set; }

    public string Test4 { get; set; }

}

        List<MyTestCase> TestResultList = GetTestResults();

        List<TestResultsInfo> testResultInfo = new List<TestResultsInfo>();

        var results = from p in TestResultList
                      group p by p.MachineName into grps
                      select new
                      {
                          MachineName = grps.Key,
                          Test1 = grps.FirstOrDefault(pp => pp.TestName == "Test1").Result,
                          Test2 = grps.FirstOrDefault(pp => pp.TestName == "Test2").Result,
                          Test3 = grps.FirstOrDefault(pp => pp.TestName == "Test3").Result,
                          Test4 = grps.FirstOrDefault(pp => pp.TestName == "Test4").Result
                      };

        int testResultId = 1;

        foreach (var result in results)
        {
            TestResultsInfo machineTestInfo = new TestResultsInfo();
            machineTestInfo.ID = testResultId++;
            machineTestInfo.MachineName = result.MachineName;
            machineTestInfo.Test1 = result.Test1;
            testResultInfo.Add(machineTestInfo);
        }

1 个答案:

答案 0 :(得分:0)

如果您使用的是C#6,则使用空操作数来避免NullReferenceException

var testResultInfo = TestResultList.GroupBy(x => x.MachineName)
                                   .Select((x, i) => new TestResultsInfo
                                   {
                                       ID = i + 1,
                                       MachineName = x.Key,
                                       Test1 = x.FirstOrDefault(y => y.TestName == "Test1")?.Result,
                                       Test2 = x.FirstOrDefault(y => y.TestName == "Test2")?.Result,
                                       Test3 = x.FirstOrDefault(y => y.TestName == "Test3")?.Result,
                                       Test4 = x.FirstOrDefault(y => y.TestName == "Test4")?.Result
                                   })
                                   .ToList();

但是如果您不使用C#6,则使用LINQ中的DefaultIfEmpty方法。

var @default = new MyTestCase();
var testResultInfo = TestResultList.GroupBy(x => x.MachineName)
                                   .Select((x, i) => new TestResultsInfo
                                   {
                                       ID = i + 1,
                                       MachineName = x.Key,
                                       Test1 = x.Where(y => y.TestName == "Test1").DefaultIfEmpty(@default).First().Result,
                                       Test2 = x.Where(y => y.TestName == "Test2").DefaultIfEmpty(@default).First().Result,
                                       Test3 = x.Where(y => y.TestName == "Test3").DefaultIfEmpty(@default).First().Result,
                                       Test4 = x.Where(y => y.TestName == "Test4").DefaultIfEmpty(@default).First().Result
                                   })
                                   .ToList();