C#对列表中的数字进行排序

时间:2017-12-01 19:38:01

标签: c# list sorting

我将用一个例子来解释我的问题:我想将列表(0,1,2,6,7)排序到列表(6,7,0,1,2),所以我在列表,也就是说大于4应该按升序排序,从最小的开始,然后是小于4的所有内容,按升序排列,从最小的开始。

2 个答案:

答案 0 :(得分:2)

制作这个比较器:

public class MyComparer : IComparer<int>
{
    public int Divider { get; set; }
    public MyComparer(int divider) { Divider = divider; }

    public int Compare(int x, int y)
    {
        if (x < Divider && y > Divider) return 1;
        if (x > Divider && y < Divider) return -1;
        return x.CompareTo(y);
    }
}

然后你可以运行这段代码:

List<int> list = new List<int> { 0, 1, 2, 6, 7 };
list = list.OrderBy(i => i, new MyComparer(4)).ToList();

请注意,如果问题应该是4组中的第一个条目或6,7组中的最后一个条目,则问题中您不希望如何处理值0,1,2本身。根据您的预期,上述每条if()行的不等式比较之一应包含=

答案 1 :(得分:1)

可以使用linq:

using System;
using System.Collections.Generic;
using System.Linq;

internal class Program
{
    static void Main(string[] args)
    {
        List<int> myList = new List<int> { 0, 1, 2, 6, 7 };

        var bigger4 = myList           // from myList   
            .Where(item => item > 4)   // filter all bigger 4
            .OrderBy(i => i)           // order them by value ascending
            .ToList();                 // make list to allow AddRange() later

        // I am putting 4rs into this list 
        var smaller5 = myList          // from myList
            .Where(item => item <= 4)  // filter all smalller equal 4
            .OrderBy(i => i);          // order them by value ascending

        bigger4.AddRange(smaller5);    // add to first list

        // output as string with , between values:
        Console.WriteLine(string.Join(",", bigger4)); // which smaller5 added into bigger4
        Console.ReadLine();
    }
}

或者将它放在Extensionmethod中:

internal static class SillyThing
{
    static public IList<int>
        SortBigger_K_InFrontAnscendingThenAddSmallerEqual_K_Ascending(
            this IList<int> list, int K)
    {
        var biggerK = list
            .Where(item => item > K)   // filter all bigger K
            .OrderBy(i => i)           // order them by value ascending
            .ToList();                 // make list to allow AddRange() later

        // I am putting 4rs into this list
        var smallerK = list
            .Where(item => item <= K)  // filter all smalller equal K
            .OrderBy(i => i);          // order them by value ascending

        biggerK.AddRange(smallerK);    // add to first list

        return biggerK;
    }
}

并称之为:

var newList = "1,2,3,4,5,6,7,8,9,0,12,14,16,17,192,222,66,44,22,11".Split(',')
    .Select(n => int.Parse(n))
    .ToList();

Console.WriteLine( 
   string.Join(",", newList.
        SortBigger_K_InFrontAnscendingThenAddSmallerEqual_K_Ascending(70)));
Console.ReadLine();

免责声明:

@JoelCoehoorn的方法是可重用的,然后使用特定的SILLY扩展方法。