基于函数排序
本文关键字:排序 函数 于函数 | 更新日期: 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)));
这里假设myList
是System.Collections.Generic.List<>
。
如果您想要另一个排序方向,将x
和y
交换到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
。