1

LINQ atm 遇到问题。我目前有一个可以有两个名称的类 - MeterName 和 ChannelName;两个字符串。但是,ChannelName 属性可能为空或 null。此类称为 ChannelRecord,其中包含与 Meter + Channel 名称相关的一些其他属性。

这些存储在一个列表中,该列表映射到字典中的日期时间。这意味着我们有这个:

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()从中获取价值。

做什么?

4

2 回答 2

0

问题是list => list.Select(record => record.MeterName)insideOrderBy返回IEnumerable<string>,而事实并非如此IComparable

如果您想重新排序字典中的列表但保持字典本身不变(即日期键将保留在原位),您可以这样做:

var orderedMap = outputMap
    .ToDictionary(
        x => x.Key
    ,   x => x.Value
           .OrderBy(element => element.MeterName)
           .ThenBy(element => element.ChannelName)
           .ToList()
    );
于 2013-11-04T15:13:29.770 回答
0

在这部分:

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

lambda 的结果是字符串的 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());
于 2013-11-04T15:16:14.893 回答