基于函数排序

本文关键字:排序 函数 于函数 | 更新日期: 2023-09-27 18:06:13

我有一个方法,给定2个字符串,他返回一个数字(0到100之间),表示它们的相似度,为0"完全不相似"和100"它们是相同的"

现在的事情是,我有一个县的列表(字符串名称,GeoRef坐标,字符串市长),我想排序基于我的函数返回…
我在寻找类似myList.Sort(f=>MyScoreEvaluator("York",f.Name))的东西

谁能告诉我怎么做?

Edit1:我不认为方法"排序"是相当我想要的…排序比较列表内的项目…我想将列表中的项目与外部信息进行比较,并基于该结果对项目

进行排序。

OrderBy和orderbydescent返回相同的条目顺序…

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

基于函数排序

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

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

你可以直接使用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))

LINQ中有一个OrderBy:

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

或按降序排序:

var sortedDesc = myList.OrderByDescending(f => MyScoreEvaluator("York", f.Name))

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

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

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

这里假设myListSystem.Collections.Generic.List<>

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

编辑:

记住List<> 上的.Sort方法修改了相同的实例。Sort方法的返回类型为void。另一方面,OrderBy创建了一个新的IEnumerable<>,您可以在其上调用.ToList()来获得一个新的列表对象。旧的东西没有改变。您可以将新对象赋值给保存原始列表的变量。其他引用旧对象的变量不受此影响。例子:

myList = myList.OrderBy(f => MyScoreEvaluator("York", f.Name)).ToList();
新编辑:

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