List.Sort(自定义排序......)

时间:2010-06-25 15:49:49

标签: c# sorting

我有一个List对象,其中包含3个项目:Partial,Full To H和Full To O。

我将此列表绑定到asp OptionButtonList,并按字母顺序对其进行排序。但是,我想按如下方式对列表进行排序:

Full到H,Partial,Full到O。

我该如何做到这一点?

8 个答案:

答案 0 :(得分:23)

Linq非常棒。您甚至可以构建订单序列,以便在运行时定义,因为在ToList之前不会执行排序。

 var sortedList = yourList.OrderBy(i => i.FullToH).
     ThenBy(i => i.Partial).
     ThenBy(i => i.FullToO).ToList();

答案 1 :(得分:12)

感谢大家的帮助!

我是这样做的:

List<string> sortedList = new List<string>();
sortedList = list.OrderBy(i => i.CodeValue == "FullToH").ThenBy(i => i.CodeValue == "Partial").ThenBy(i => i.CodeValue == "FullToO").ToList();

然后绑定到sortedList!

答案 2 :(得分:12)

好的,我知道这已经有几年了,但我有一个替代解决方案,我认为比未来读者可能想要考虑的上述解决方案更优雅:

在你班上:

static readonly List<String> codeValueSortOrder = new List<String> {
    "Full To H", 
    "Partial",
    "Full To O"
};

并在您的方法中:

sortedList = list.OrderBy(i=> codeValueSortOrder.IndexOf(i.CodeValue));

答案 3 :(得分:8)

您列出的项目(例如FullToHo)是否只是字符串?如果是这样,那么您需要做的就是编写一个方法来进行比较并使用该方法进行排序。

public int CompareEntries(string left, string right) {
  const string fullToH = "Full To H";
  const string partial = "Partial";
  const string fullToO = "Full To O";
  if ( left == right ) {
    return 0;
  } else if ( left == fullToH ) {
    return -1;
  } else if ( left == fullToO ) {
    return 1;
  } else if ( right == fullToH ) {
    return 1;
  } else {
    return -1; 
  }
}

list.Sort(CompareEntries);

答案 4 :(得分:3)

答案 5 :(得分:3)

假设您的列表不是

 List<object> myList = new List<object>();

但相反,像

List<MyObjectClass> myList = new List<MyObjectClass>();

(其中每个元素具有相同的对象类型)

你可以这样做:

myList.Sort((firstObj, secondObj) =>
    {
        return firstObj.SomeProperty.CompareTo(secondObj.SomeProperty);
    }
);

答案 6 :(得分:0)

为您的自定义类型(实现IComparer接口)创建Comparer。然后,您可以使用它对List进行排序:

List<CustomType> list = new List<CustomType>();

// Fill list
list.Sort(new CustomComparer());

或者,如果您使用较新版本的框架而不需要重复使用排序逻辑,则可以使用IEnumerable<T>.OrderBy()方法。

答案 7 :(得分:0)

假设您有字符串项目,并且您希望按照其他列表优先级来确定它们的优先级。 这是我的示例,其中我有优先级列表,这些优先级将在按优先级排序的列表中排在首位。

结果

kitty , some item , kk abb , ccc , kk abc, some flash
class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            var input = new List<string>()
            {
                "some item",
                "some flash",
                "kitty",
                "ccc",
                "kk abc",
                "kk abb"

            };

            var sorted = input.OrderBy(x => x, new Comparer()).ToList();

            Console.ReadKey();
        }
    }

    public class Comparer : IComparer<string>
    {
        private List<KeyValuePair<string, int>> priorities = new List<KeyValuePair<string, int>>()
        {
            new KeyValuePair<string, int>("some item", 2),
            new KeyValuePair<string, int>("kitty", 1),
            new KeyValuePair<string, int>("kk abb", 3),
        };
        public int Compare(string x, string y)
        {
            var anyX = priorities.Any(z => z.Key == x);
            var anyY = priorities.Any(z => z.Key == y);
            if (anyX || anyY)
            {
                var firstX = priorities.FirstOrDefault(z => z.Key == x);
                var firstY = priorities.FirstOrDefault(z => z.Key == y);
                if (anyX && anyY)
                {
                    if (firstX.Value > firstY.Value)
                    {
                        return firstX.Value;
                    }

                    return -firstX.Value;
                }

                if (anyX)
                {
                    return -firstX.Value;
                }

                if (anyY)
                {
                    return firstY.Value;
                }

            }


            return string.Compare(x, y, StringComparison.Ordinal);
        }
    }