在C#中排序列表的方法

时间:2016-04-07 14:57:30

标签: c# sorting

我已经在下面写了选择排序方法。我想保留一般的代码,因为它是一个学校练习,但我知道有更多正确的方法可以做到这一点,就像Linq一样。 除了它只对PersonalNumber属性进行排序之外,它的效果很好。我可以看到错误如下:

temp = list[i].PersonalNumber;
list[i].PersonalNumber = list[posMin].PersonalNumber;
list[posMin].PersonalNumber = temp;

有没有办法对列表中每个索引包含的所有属性进行排序?或者我是否必须为每个属性编写上述代码?总共有三个属性。

完整方法:

public static void SelectionSort(List<Person> list) {
    // With this method the Person list is sorted in ascending order. 
    //posMin is short for position of min
    int posMin, temp;
    for (int i = 0; i < list.Count - 1; i++) {
        posMin = i;//Set posMin to the current index of array
        for (int j = i + 1; j < list.Count; j++) {
            if (list[j].PersonalNumber < list[posMin].PersonalNumber) {
                //posMin will keep track of the index that min is in, this is needed when a swap happens
                posMin = j;
            }
        }

        //if pos_min no longer equals i than a smaller value must have been found, so a swap must occur
        if (posMin != i) {
            temp = list[i].PersonalNumber;
            list[i].PersonalNumber = list[posMin].PersonalNumber;
            list[posMin].PersonalNumber = temp;
        }
    }
}

3 个答案:

答案 0 :(得分:2)

绝对不是你应该手动做的事情(除非你正在训练你的算法技能:))。它会使您的代码更复杂,更难维护。

刚刚提出:

using System.Linq;

并执行此操作:

var sorted = list.OrderByDescending(x => x.PersonalNumber).ToList();

你不需要成为Linq忍者使用它。我也强烈建议你开始使用它。我认为你可以同意它很容易阅读,很明显它在做什么。

啊,如果你想要升序排序,只需使用.OrderBy而不是.OrderByDescending。

答案 1 :(得分:1)

如果您想对列表进行排序,只需添加Sort

list.Sort((x, y) => x.PersonalNumber.CompareTo(y.PersonalNumber));

要按降序顺序排序,请添加-

list.Sort((x, y) => -x.PersonalNumber.CompareTo(y.PersonalNumber));

答案 2 :(得分:0)

对于大多数情况,您应该使用其中一个内置功能进行排序,例如List<T>.SortEnumerable.OrderBy。我假设你想保留自己的排序算法实现。

您可以将键选择器函数作为方法的第二个参数:

public static void SelectionSort<TSource, TKey>(
    List<TSource> list, 
    Func<TSource, TKey> keySelector) 
{
    // With this method the list is sorted in ascending order. 
    //posMin is short for position of min
    int posMin;
    for (int i = 0; i < list.Count - 1; i++) {
        posMin = i;//Set posMin to the current index of array
        for (int j = i + 1; j < list.Count; j++) {
            if (keySelector(list[j]) < keySelector(list[posMin])) {
                //posMin will keep track of the index that min is in, this is needed when a swap happens
                posMin = j;
            }
        }

        //if pos_min no longer equals i than a smaller value must have been found, so a swap must occur
        TSource temp;
        if (posMin != i) {
            temp = list[i];
            list[i] = list[posMin];
            list[posMin] = temp;
        }
    }
}

然后您将使用lambda表达式使用它:

SelectionSort(persons, (Person p) => p.PersonalNumber);