我有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);
}
答案 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();