字符串到数组,按第三个字/列排序

我有一个包含数字,单词和换行符的字符串,我将其拆分为数组。

如果我运行Array.Sort(lines) ,它将按列1, Number对数字进行数字排序。

我如何通过第3列, Color按字母顺序对数组进行排序?


注意:它们不是真正的列,只是分隔单词的空格。

我无法修改字符串来更改结果。


 | Number | Name | Color | |------------|------------|------------| | 1 | Mercury | Gray | | 2 | Venus | Yellow | | 3 | Earth | Blue | | 4 | Mars | Red | 

C#

示例: http : //rextester.com/LSP53065

 string planets = "1 Mercury Gray\n" + "2 Venus Yellow\n" + "3 Earth Blue\n" + "4 Mars Red\n"; // Split String into Array by LineBreak string[] lines = planets.Split(new string[] { "\n" }, StringSplitOptions.None); // Sort Array.Sort(lines); // Result foreach(var line in lines) { Console.WriteLine(line.ToString()); } 

期望的排序数组结果

 3 Earth Blue 1 Mercury Gray 4 Mars Red 2 Venus Yellow 

试试这段代码:

 string planets = "1 Mercury Gray \n" + "2 Venus Yellow \n" + "3 Earth Blue \n" + "4 Mars Red \n"; var lines = planets.Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries) .OrderBy(s => s.Split(' ')[2]) .ToArray(); foreach (var line in lines) { Console.WriteLine(line); } 

编辑:谢谢@Kevin!

Aleks得到了直截了当的回答 – 我只是想从另一个角度做出贡献。

这段代码很好地来自学术界,只是学习概念的观点。

但是如果你想将它转化为商业开发者的东西,你应该养成如下结构的习惯:

  • 开发一个Planet类
  • 有一个从源文本行返回Planet的函数
  • 有一个显示行星的function,您打算如何显示它。

这有很多原因,但最重要的原因是你将拥有可重用,灵活的代码(看看你现在正在编写的function – 你有可能重用它的可能性。换行?)如果您有兴趣,请查看有关SRP(单一责任原则)的一些信息,以获得有关此概念的更多信息。

这是您的代码的翻译版本:

  static void Main(string[] args) { string planetsDBStr = "1 Mercury Gray \n" + "2 Venus Yellow \n" + "3 Earth Blue \n" + "4 Mars Red \n"; List planets = GetPlanetsFromDBString(planetsDBStr); foreach (Planet p in planets.OrderBy(x => x.color)) { Console.WriteLine(p.ToString()); } Console.ReadKey(); } private static List GetPlanetsFromDBString(string dbString) { List retVal = new List(); string[] lines = dbString.Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); foreach (string line in lines) retVal.Add(new Planet(line)); return retVal; } public class Planet { public int orderInSystem; public string name; public string color; public Planet(string databaseTextLine) { string[] parts = databaseTextLine.Split(' '); this.orderInSystem = int.Parse(parts[0]); this.name = parts[1]; this.color = parts[2]; } public override string ToString() { return orderInSystem + " " + name + " " + color; } } 

编辑:修复了一些格式问题

您可以使用带有自定义比较器的Array.Sort 重载 :

 public class MyComparer : IComparer { int IComparer.Compare( Object x, Object y ) { //compare last parts here } }