至少有一个对象必须实现IComparable调用OrderBy()
我已经看到了这个问题,但我没有找到答案中的快乐……
我想这样做:
var coll = JsonConvert.DeserializeObject<ObservableCollection>(json); coll = coll.OrderBy(a => a.tags).Distinct().ToList();
引发错误:
至少有一个对象必须实现IComparable。
目前我没有找到解决方案,所以我这样做:
List categories = new List(); var coll = JsonConvert.DeserializeObject<ObservableCollection>(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 tags { get; set; }
要订购一组东西,必须有一种方法来比较两件事来确定哪一件更大或更小,或者它们是否相等。 任何实现IComparable
接口的c#类型都提供了将其与另一个实例进行比较的方法。
您的tags
字段是字符串列表。 没有标准的方法来以这种方式比较两个字符串列表。 类型List
不实现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> { // implementation }
并像这样使用它:
var comparer = new MyStringListComparer(); coll = coll.OrderBy(a => a.tags, comparer).Distinct().ToList();
在String的情况下,ArticleJSON不实现IComparable。 编译器不知道如何比较您正在调用的OrderBy()的ArticleJSON。 因此,当你使用字符串列表时,它工作正常。
上述就是C#学习教程:至少有一个对象必须实现IComparable调用OrderBy()分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1010996.html