我已经看到了这个问题,但我没有找到答案的快乐。。。
我正在努力做到这一点:
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; }
要对一组事物进行排序,必须有一种方法来比较两个事物,以确定哪个更大、哪个更小或它们是否相等。任何实现IComparable
接口的c#类型都提供了将其与另一个实例进行比较的方法。
您的tags
字段是一个字符串列表。没有标准的方法可以用这种方式比较两个字符串列表。类型List<string>
不实现IComparable
接口,因此不能在LINQ OrderBy
表达式中使用。
例如,如果你想按标签数量订购文章,你可以这样做:
coll = coll.OrderBy(a => a.tags.Count).ToList();
因为CCD_ 6将返回一个整数并且一个整数是可比较的。
如果你想按排序获得所有唯一的标签,你可以这样做:
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();
ArticleJSON不实现IComparable,而String实现。编译器不知道如何比较您正在调用的OrderBy()的ArticleJSON。因此,当您使用字符串列表时,它可以很好地工作。