gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:35:47 25 4
gpt4 key购买 nike

我已经看到了这个问题,但我对答案并不满意......

我正在尝试这样做:

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

抛出错误:

At least one object must implement 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# 类型接口(interface),提供将其与另一个实例进行比较的方法。

你的 tags field 是一个字符串列表。没有以这种方式比较两个字符串列表的标准方法。类型List<string>没有实现 IComparable接口(interface),因此不能在 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();

关于c# - 至少一个对象必须实现 IComparable 调用 OrderBy(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29465104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com