2009-12-24 47 views
0

我是LINQ的新手,並且我嘗試編寫自學LINQ的查詢時遇到了問題。使用LINQ在一個條件下連接對象

我有一個MyError對象的列表。 MyError對象具有MyEntryError對象的錯誤代碼(枚舉)和數組列表。一些MyError可能具有相同的錯誤代碼。

我想創建一個LINQ查詢作爲輸入我的MyError的列表,並輸出MyError的一個新的列表,這樣,對於每一個錯誤代碼,只有一個MyError將包含所有與錯誤代碼失敗MyEntryError的MyError。

我的意思是讓我們說我有MyError對象的列表,如這一個:

  • MyError1:錯誤碼= ErrorType1的ArrayList:A,C
  • MyError2:錯誤碼= ErrorType2的ArrayList:B, d,E
  • MyError3:錯誤碼= ErrorType2 ArrayList的:F
  • MyError4:錯誤碼= ErrorType1的ArrayList:ģ
  • MyError5:錯誤碼= ErrorType3 ArrayList的位:Z

我的期望的輸出是MyError的列表與以下對象對象:

  • MyError1:錯誤碼= ErrorType1 ArrayList中:A,C,G
  • MyError2:錯誤碼= ErrorType2 ArrayList中:B,d ,E,F
  • MyError3:錯誤碼= ErrorType3的ArrayList位:Z

是否有可能與LINQ?如果是這樣,怎麼樣?

我猜測在MyError類中使用ArrayList而不是List可能是一個問題,所以如果它不能用ArrayList完成,我想看到一個查詢可以與修改後的MyError類使用List提前

感謝

回答

2
public List<MyError> GroupErrorsByErrorCode(List<MyError> errors) 
    { 
     var result = errors.GroupBy(e => e.ErrorCode).Select(group => new MyError 
      { 
       ErrorCode = group.Key, 
       // EDIT: was 
       // Errors = group.SelectMany(g => g.Errors) 
       Errors = new ArrayList(group 
          .SelectMany(g => g.Errors.Cast<MyEntryError>()) 
          .ToList()) 
      }); 
     return result; 
    } 

編輯:由於ArrayList中有一個構造函數的ICollection的,你可以使用重載來實例Errors屬性。

使用強類型的列表,而不是ArrayList的總是一個好主意......

+0

我知道泛型更好,事情是,我在開發一個真正的項目時提取了這個練習。在真正的項目中,我無法更改這些類,因爲它們是生成的,我無法訪問這些類或生成器(是的,我知道生成的代碼是邪惡的,但我再一次不是那種使決定...)。 – Ksempac 2009-12-24 13:53:49

+0

這是可能的ArrayList,只是檢查我的答案。 – 2009-12-24 14:00:48

+0

@Jan Jongboom:這個問題指出輸出應該是MyError對象的列表。這裏的結果是一個匿名對象列表。如果MyError.Errors是一個ArrayList類型的屬性,我不明白你將如何實例化它。 – jeroenh 2009-12-24 14:21:03

1

類似,其中errorList是您MyError1噸/米MyError5的列表,而您的ArrayList被稱爲errors

from err in errorList 
group err by err.errorcode into g 
select new MyError { errorcode = g.Key, errors = new ArrayList(g.SelectMany(a => a.errors.Cast<YourType>()).ToArray()) }; 
+0

你的解決方案是有趣的,但它並不完全輸出MyError對象:它的輸出有錯誤代碼和一個IEnumerable <新對象YourErrorType>這對我的實際需求來說確實很好,但不完全是一個「完美」的答案。我試圖擺弄它,試圖讓它使用它的ArrayList生成一個MyError對象。 – Ksempac 2009-12-24 14:21:18

+0

這會產生一個匿名對象的列表,而不是MyError對象的列表... – jeroenh 2009-12-24 14:21:34

+0

編輯爲返回MyError。 – 2009-12-24 14:34:34