2016-09-24 70 views
1

我有一個結構作爲集團通過在C#中的多列結構列表

public struct structMailJob 
{ 
public string ID; 
public string MailID; 
public int ResendCount; 
public int PageCount; 
} 

和列表作爲

List<structMailJob> myStructList = new List<structMailJob>(); 

我從數據庫加載數據 myStructList,想myStructList數據在由MailID和ResendCount分組後的新列表中。

我試圖爲:

List<structMailJob> newStructList = new List<structMailJob>(); 

newStructList = myStructList.GroupBy(u => u.MailID, u=>u.ResendCount) 
            .Select(grp => new { myStructList = grp.ToList() }) 
            .ToList(); 

,但無法做到,由於收到錯誤消息 - 不能泛型列表隱式轉換到structMailJob。

+0

請到這個[鏈接](http://stackoverflow.com/問題/ 847066/group-by-multiple-columns) –

+0

使用var變量並檢查query.check天氣它是類型錯誤@ gaurav –

+0

'grp => new {myStructList = grp.ToList()}'語句創建一個匿名對象的唯一屬性是名爲myStructList的列表。這種類型將作爲結果集合的項目, 而您期望收集您的特定類型。 集合類型不匹配,因此是例外。
我會很樂意幫助你實現你的目標,如果你告訴我你想要對數據做什麼..有幾種方法可以去取決於用例.. –

回答

1

LINQ查詢是完全不正確,以下是要點:

myStructList.GroupBy(u => u.MailID, u=>u.ResendCount) //不正確的分組

myStructList.GroupBy(u => new {u.MailID, u.ResendCount }) //正確分組,將由兩列MailIDResendCount做,最後一個只做MailID並且使用ResendCount進行結果預測

現在結果是IEnumerable<IGrouping<AnonymousType,structMailJob>>,所以當你這樣做Select,它最終將建立IEnumerable<List<structMailJob>>型的拼接列表(刪除分配到myStructList選擇裏面,因爲這是不正確的):

.Select(grp => grp.ToList()) 

正確的代碼將要求您採用扁平化作爲SelectMany如下:

newStructList = myStructList.GroupBy(u => new {u.MailID, u.ResendCount}) 
             .SelectMany(grp => grp.ToList()).ToList(); 

將其分配給newStructList,但是這個代碼已經很少使用,因爲從字面上newStructList是完全一樣的myStructList扁平化後,最好你應該能夠使用分組,這樣喲ü可以得到一個子集,因此正確的結果,但是這取決於你的業務邏輯

+0

謝謝,它的工作。 – Gaurav

0

我不知道我的問題是否正確,但在我看來,您錯過了'Group by'簽名。

List<structMailJob> myStructList = new List<structMailJob>(); 

List<structMailJob> newStructList = new List<structMailJob>(); 

newStructList = myStructList 
    // .GroupBy(/*Key Selector */u => u.MailID, /*Element Selector*/u=>u.ResendCount)   
    .GroupBy(u => new { u.MailID, u.ResendCount }) // broup by MailID, ResendCount 
    // Note no Element Selector , the 'STRUCT' is 'SELECTED' 
    .Select(grp => { 
     // NOte: Key == Anonymous {MailID, ResendCount } 
     return grp; 
    }) 
    // otherwise you get a IEnumerable<IEnumerable<T>> instead of IEnumerable<T> because you grouped it 
    .SelectMany(x=>x) 
    .ToList(); 
1

我認爲你正在尋找的是以下幾點:

var newStructList = myStructList.GroupBy(smj => new { smj.MailID, smj.ResendCount }) 
           .Select(grp => new 
           { 
            MailID = grp.Key.MailID, 
            ResendCount = grp.Key.ResendCount 
            MailJobs = grp.Select(x=>new 
               { 
                x.ID, 
                x.PageCount 
               }).ToList() 
           }) 
           .ToList(); 

注意,我們改變了GroupBy條款以下之一:

GroupBy(smj => new { smj.MailID, smj.ResendCount }) 

這樣做,在這將要創建的組將鍵由兩個MailIDResendCount的。順便說一句,前GroupBy條款是不正確的。

然後成就了分組,我們預計各組對象具有三個屬性,MailIDResendCout,這是匿名類型的對象有兩個屬性,IDPageCount鍵和列表的組件,這是我們給它名字MailJobs。

最後但並非最不重要,你會發現,我沒有提到以下

List<structMailJob> newStructList = new List<structMailJob>(); 

我只是用var並宣佈newStructList。我不認爲你在你的帖子中陳述有道理。我們如何期望在對它們進行分組後得到相同對象的列表?所以我假設,你可能想要的是以上。

但是,我想你可能也想這樣,你不想參考分組

myStructList = myStructList.OrderBy(smj => smj.MailID) 
          .ThenBy(smj => smj.ResendCount) 
          .ToList(); 
+0

謝謝,它的工作。 – Gaurav

+0

@Gaurav不客氣。 – Christos

+0

感謝您的幫助,在您的第一個解決方案中,我猜想有小錯字,並添加了smj。作爲新的{smj.MailID,smj.ResendCount}和逗號後ResendCount = grp.Key.ResendCount, – Gaurav

0

如果Mrinal Kamboj的答案是你在找什麼,那麼你可以使用下面的替代:

var orderedList = myStructList.OrderBy(x => x.MailID).ThenBy(x => x.ResendCount);