首先按字母顺序排序字符串列表,然后按数字排序

时间:2017-07-10 13:43:23

标签: c# linq sorting

所以我有一个具有类型字符串属性的对象列表。我希望对象按该属性排序。问题如下: 列表看起来像这样的

12 Apple 
43 Banana
22 Apple 
90 Banana
13 Banana
67 Apple

我希望列表的排序方式如下:

12 Apple
22 Apple
67 Apple
13 Banana
43 Banana
90 Banana

我正在尝试一下,我试图像这样完成它:

myList.Sort(x, y) => x.Value.Contains("Banana").CompareTo(x.Value.Contains("Banana");

但是这不起作用。 任何人都知道如何完成

3 个答案:

答案 0 :(得分:6)

您可以使用LINQ:

var orderedFruits = fruitList.OrderBy(f => f.Value).ThenBy(f => f.FruitId);

如果您希望它再次成为列表:

fruitList = orderedFruits.ToList();

好吧,如果字符串属性实际上包含数字和水果名称,那么它会更复杂,最好通过将两个信息存储在不同的属性中来修复您的类。

然而:

var orderedFruits = fruitList
   .Select(f => new { arr = f.Value.Split(), OriginalFruit = f })
   .Where(x => x.arr[0].Trim().All(char.IsDigit))
   .Select(x => new { ID = int.Parse(x.arr[0].Trim()), Fruit = x.arr.Last().Trim(), x.OriginalFruit })
   .OrderBy(x => x.Fruit)
   .ThenBy(x => x.ID)
   .Select(x => x.OriginalFruit);

答案 1 :(得分:1)

试试这个,

 var orderfruitlist = fruitslist.OrderBy(x => x.Fruit.Split(' ')[1]).ThenBy(x => x.Fruit.Split(' ')[0]);

答案 2 :(得分:0)

现在,假设(a)" 12 Apple"是一个字符串,并且(b)问题的标题是错误的,你实际上想要首先对单词进行排序,然后按数字排序,这不会那么难 - 假设所有数字都是2位数:

var sorted = from f in fruitlist
           orderby f.Substring(3), f
           select f;

现在,如果数字可以多于或少于2位数,那么我们必须更多地参与其中: (已更新以进行正确的数字排序)

var sorted = from f in fruitlist
           let parts = f.Split(' ')
           orderby parts[1], Int32.Parse(parts[0])
           select f;