根据功能排序

时间:2013-03-28 14:26:52

标签: c# sorting

我有一个给出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));

4 个答案:

答案 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)));

这假定myListSystem.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