我有一个给出2个字符串的方法,他返回一个数字(0到100之间),表示它们有多相似,0“完全不相似”,100“它们是相同的”
现在的问题是我有一个县的列表(字符串名称,GeoRef坐标,字符串Mayor),我想根据函数的返回进行排序...
我正在寻找像myList.Sort(f=>MyScoreEvaluator("York",f.Name))
谁能告诉我怎么做?
编辑1:我不认为方法“排序”是我想要的...排序比较列表内的...我想比较列表的itens与外部信息并基于该结果对项目进行排序
OrderBy和OrderByDescending返回相同的商品订单...
Edit2: Heres是我正在使用的OrderBy的代码:aux.OrderBy(f => StringComparisonHelper.HowAlike(f.Name, countyNameSearched));
答案 0 :(得分:1)
LINQ中有OrderBy
:
var sorted = myList.OrderBy(f => MyScoreEvaluator("York", f.Name))
或者降序排序:
var sortedDesc = myList.OrderByDescending(f => MyScoreEvaluator("York", f.Name))
答案 1 :(得分:1)
您可以使用OrderBy:
list.OrderBy(f => MyScoreEvaluator("York", f.Name))
或实施自定义Comparer:
public static int SortByName(County x, County y)
{
return x.Name.CompareTo(y.Name);
}
用法:
list.Sort(new Comparison<County>(SortByName))
答案 2 :(得分:1)
您可以使用OrderBy
,然后重新分配您的列表:
list = list.OrderBy(f => MyScoreEvaluator("York", f.Name))
答案 3 :(得分:-1)
使用LINQ OrderBy
扩展名非常容易(请参阅其他人的回答)。
如果您想使用Sort
,那就是:
myList.Sort((x, y) => MyScoreEvaluator("York", x.Name)
.CompareTo(MyScoreEvaluator("York", y.Name)));
这假定myList
是System.Collections.Generic.List<>
。
如果您想要其他排序方向,请在lambda箭头x
的一侧交换y
和=>
。
编辑:
请记住.Sort
上的List<>
方法修改同一个实例。 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
。