2017-03-09 39 views
-2

是否有可能根据它们的级别和按字母顺序使用linq对分段字符串进行排序?如何使用linq按照级别对分段的字符串进行排序?

对于示例 -

定列表

System 
System.Collection.Generic 
System.Generic 
System.Linq 
System.Linq.Collection.Generic 

排序清单

System 
System.Generic 
System.Linq 
System.Collection.Generic 
System.Linq.Collection.Generic 
+0

我想你可以使用自定义IComparable的做到这一点。 http://stackoverflow.com/questions/985657/use-own-icomparert-with-linq-orderby – Paparazzi

+5

你甚至尝试过*任何*来实现这一目标吗?或者我们应该做你的工作? – HimBromBeere

回答

3

您可以通过数量订购.每个字符串:

var sortedItems = items 
    // Order by number of periods ("levels") 
    .OrderBy(x => x.Count(c => c == '.')) 

    // Then everything else alphabetically 
    .ThenBy(x => x); 

这里有一个小提琴证明:https://dotnetfiddle.net/FivBPA

+0

这比我的回答要好,因为它不依赖于分割字符串 – TheLethalCoder

+0

@ TheLethalCoder无论如何都满足了你的要求,因为你击败了我。 :) –

1

我想你只需要通过数字或零件,然后一个正常的字母顺序订购:

var result = list.OrderBy(s => s.Split('.').Length).ThenBy(s => s); 

一个更好的(也可能更快)的方式做这将是计数字符串,而不是分裂他们(从this answer by @NateBarbettini采取的想法)在. S中的号码:

var result = list.OrderBy(s => s.Count(c => c == '.')).ThenBy(s => s); 
0

您可以通过用户OrderBy()Count()

Demo on .NetFiddle

using System; 
using System.Linq; 


public class Program 
{ 
    public static void Main() 
    { 
     var k = @"System 
System.Collection.Generic 
System.Generic 
System.Linq 
System.Linq.Collection.Generic"; 

     // We split by new line, then order them by occurrence count of '.' 
     var ordered = k.Split('\n').OrderBy(x => x.Count(l => l == '.')) 

     foreach (var item in ordered) 
      Console.WriteLine(item); 
    } 
} 

输出

System 
System.Generic 
System.Linq 
System.Collection.Generic 
System.Linq.Collection.Generic 
相关问题