2013-11-04 90 views
1

遇到與LINQ atm有關的問題。 我目前有一個類可以有兩個名稱 - MeterName和ChannelName;兩個字符串。但是,ChannelName屬性可能爲空或爲空。 該類稱爲ChannelRecord,其中包含與Meter + Channel名稱相關的其他一些屬性。基於對象列表中屬性的訂購地圖

這些存儲在列表中,該列表映射到字典中的DateTime。這意味着我們有這樣的:

Dictionary<DateTime, List<ChannelRecord>> outputMap = ....; 

我想根據自己的儀表&頻道命名的頻道記錄進行排序,以開始數字和符號來第一和z最後來米。

到目前爲止,我的代碼如下所示:

var orderedMap = outputMap.Select(x => x.Value) // as in KeyValuePair<TKey,TValue> 
     .OrderBy(list => list.Select(record => record.MeterName)) 
     .ThenBy(list => list.Select(record => record.ChannelName)); 

不過,我得到的是「其中一個對象必須實現IComparable」除外。這很有趣,因爲AFAIK,字符串實現了IComparable。我知道KeyValuePair沒有,但我是.Select()從它的值。

什麼?

回答

0

問題是list => list.Select(record => record.MeterName)裏面的OrderBy返回IEnumerable<string>,這不是IComparable

如果你想重新排序列表字典,但保留字典本身是(即日期鍵將繼續留在地方),你可以做這樣的:

var orderedMap = outputMap 
    .ToDictionary(
     x => x.Key 
    , x => x.Value 
      .OrderBy(element => element.MeterName) 
      .ThenBy(element => element.ChannelName) 
      .ToList() 
    ); 
+0

這是我去的解決方案,但它的'.OrderBy(元=> element.MeterName)' - 無需嵌套查詢。 –

+0

@DanPantry你是對的,我複製粘貼你的代碼,預期列表。感謝您的更正。 – dasblinkenlight

0

在這一部分:

.OrderBy(list => list.Select(record => record.MeterName)) 

拉姆達的結果是一個IEnumerable串,而不是一個單一的字符串。 IEnumerable可能只包含一個字符串,但編譯器現在可以知道這一點。

試試這個:

var orderedMap = outputMap.Select(x => x.Value) // as in KeyValuePair<TKey,TValue> 
    .OrderBy(list => list.Select(record => record.MeterName).First()) 
    .ThenBy(list => list.Select(record => record.ChannelName).First()); 
+0

當然這將是'list.Select(record => record.MeterName).First()'? –

+0

@DanPantry你是對的。另一種方式它會返回記錄,這可能(大概)仍然不是IComparable。 – Rik

+0

不僅如此,而且'.First()'需要一個判斷返回bool –