至少有一个对象必须实现IComparable调用OrderBy()

时间:2015-04-06 03:51:36

标签: c# linq json.net

我已经看到了这个问题,但我没有找到答案的快乐......

我正在尝试这样做:

var coll = JsonConvert.DeserializeObject<ObservableCollection<ArticleJSON>>(json);
coll = coll.OrderBy(a => a.tags).Distinct().ToList();

引发错误:

  

至少有一个对象必须实现IComparable。

目前我没有找到解决方案所以我这样做了:

List<string> categories = new List<string>();    
var coll = JsonConvert.DeserializeObject<ObservableCollection<ArticleJSON>>(json);

for (int i = 0; i < test.Count; ++i)
{
    for (int j = 0; j < test[i].tags.Count; ++j)
    {
        _categories.Add(test[i].tags[j]);
    }
}

categories = _categories.Distinct().ToList();

它有效,但我很想知道为什么第一个不起作用。

编辑:

我的数据来自JSON:

            'tags': [ 

                                        'Pantoufle',
                                        'Patate'
                                     ]
                            },
            public List<string> tags { get; set; }

2 个答案:

答案 0 :(得分:13)

要订购一组东西,必须有一种方法可以比较两件事来确定哪一件更大或更小,或者它们是否相等。任何实现IComparable接口的c#类型都提供了将其与另一个实例进行比较的方法。

您的tags字段是字符串列表。没有标准的方法来以这种方式比较两个字符串列表。类型List<string>未实现IComparable接口,因此无法在LINQ OrderBy表达式中使用。

例如,如果你想按照标签的数量订购文章,你可以这样做:

coll = coll.OrderBy(a => a.tags.Count).ToList();

因为Count将返回一个整数,并且整数具有可比性。

如果您想按排序顺序获取所有唯一标记,可以这样做:

var sortedUniqueTags = coll
    .SelectMany(a => a.Tags)
    .OrderBy(t => t)
    .Distinct()
    .ToList();

因为字符串具有可比性。

如果你真的知道如何比较两个字符串列表,你可以编写自己的自定义比较器:

public class MyStringListComparer : IComparer<List<string>>
{
    // implementation
}

并像这样使用它:

var comparer = new MyStringListComparer();
coll = coll.OrderBy(a => a.tags, comparer).Distinct().ToList();

答案 1 :(得分:1)

当String执行时,ArticleJSON不实现IComparable。编译器不知道如何比较您正在调用的OrderBy()的ArticleJSON。因此,当您使用字符串列表时,它可以正常工作。