2015-12-25 85 views
0

我有2個集合,並且我通過使用LINQ查詢將問題從一個集合添加到另一個集合時出現問題。從一個集合中選擇第一個結果,使用group by並添加到另一個集合

第一個集合類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

如果您正在使用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(); 
+0

謝謝阿爾貝託!使用C#5.0解決方案獲取「對象引用未設置爲對象的實例」。異常。我只是改變了(x => x.TestName ==「Test1」爲(x1 => x1.TestName ==「Test1」),因爲它已經使用了錯誤,所以我需要改變其他東西嗎? – Suresh

+0

謝謝它解決了!!! – Suresh

+0

還有一個查詢,以避免重複的問題內容問這裏如果我需要在TestResultsInfo類中添加更多Test,是否可能動態??就像現在我有Test1,2,3,4所以在將來我可能會測試1,2,5,6。感謝您的幫助! – Suresh

相關問題