0

我有一个方法,给定 2 个字符串,他返回一个数字(介于 0 和 100 之间),代表它们的相似程度,0“完全不相似”和 100“它们相同”

现在问题是我有一个县列表(字符串名称,GeoRef 坐标,字符串市长),我想根据我的函数的返回对其进行排序......
我正在寻找类似的东西myList.Sort(f=>MyScoreEvaluator("York",f.Name))

谁能告诉我该怎么做?

Edit1:我不认为“排序”方法是我想要的......排序比较列表内的项目......我想将列表的项目与外部信息进行比较,并根据该结果对项目进行排序

OrderBy 和 OrderByDescending 正在返回相同的项目订单...

Edit2:这是我正在使用的 OrderBy 的代码:aux.OrderBy(f => StringComparisonHelper.HowAlike(f.Name, countyNameSearched));

4

4 回答 4

1

OrderByLINQ中有一个:

var sorted = myList.OrderBy(f => MyScoreEvaluator("York", f.Name))

或者降序排序:

var sortedDesc = myList.OrderByDescending(f => MyScoreEvaluator("York", f.Name))
于 2013-03-28T14:29:09.703 回答
1

您可以只使用OrderBy

list.OrderBy(f => MyScoreEvaluator("York", f.Name))

或实现自定义比较器:

public static int SortByName(County x, County y)
{
    return x.Name.CompareTo(y.Name);
}

用法:

list.Sort(new Comparison<County>(SortByName))
于 2013-03-28T14:32:18.747 回答
1

您可以使用OrderBy并重新分配您的列表:

list = list.OrderBy(f => MyScoreEvaluator("York", f.Name))
于 2013-03-28T15:05:51.377 回答
-1

使用 LINQ 扩展非常容易OrderBy(参见其他人的答案)。

如果您想使用Sort,它将是:

myList.Sort((x, y) => MyScoreEvaluator("York", x.Name)
    .CompareTo(MyScoreEvaluator("York", y.Name)));

这假设myList是一个System.Collections.Generic.List<>.

如果你想要另一个排序方向,当然交换xy在 lambda 箭头的一侧=>

编辑:

记住.Sort方法List<> 修改同一个实例。方法的返回类型Sortvoid. 另一方面,OrderBy创建一个新IEnumerable<>的,您可以调用它.ToList()来获取一个的列表对象。旧对象不变。您可以将新对象分配给保存原始列表的变量。引用旧对象的其他变量不会受此影响。例子:

myList = myList.OrderBy(f => MyScoreEvaluator("York", f.Name)).ToList();

新编辑:

如果性能是一个问题,则不清楚使用这两者中的哪一个。该OrderBy方法只调用MyScoreEvaluator原始列表中的每个项目一次。这里介绍的Sort方法调用MyScoreEvaluator了很多次,因为它不会“记住”每次MyScoreEvaluator调用的结果(Comparison<>委托实例是算法的黑匣子Sort)。因此,如果它想比较"Fork"and "Kork",它会调用MyScoreEvaluator两次。然后,如果它想比较"Kork"and "Yorc",它会"Kork" MyScoreEvaluator再做一次。另一方面, 的排序算法List<>.Sort优于 的OrderBy

于 2013-03-28T14:41:53.623 回答