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

时间:2017-08-03 15:33:47

标签: c# arrays visual-studio sorting

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

如果我运行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

3 个答案:

答案 0 :(得分:4)

试试这段代码:

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!

答案 1 :(得分:2)

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

这个代码很好,来自学者,只是学习概念的观点。

但是,如果您希望将其转化为商业开发者的某些内容,那么您应该养成如下结构的习惯:

  • 开发一个Planet类
  • 拥有一个从源文本行返回Planet的函数
  • 有一个功能可以显示一个星球如何打算它 显示。

这有很多原因,但最重要的原因是你会拥有可重复使用的灵活代码(看看你现在正在写的功能 - 你有多大可能&#39 ;是否能够将其重新用于其他内容?)如果您有兴趣,请查看有关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<Planet> planets = GetPlanetsFromDBString(planetsDBStr);

        foreach (Planet p in planets.OrderBy(x => x.color))
        {
            Console.WriteLine(p.ToString());
        }
        Console.ReadKey();

    }

    private static List<Planet> GetPlanetsFromDBString(string dbString)
    {
        List<Planet> retVal = new List<Planet>();
        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;
        }
    }

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

答案 2 :(得分:0)

您可以使用带有自定义比较器的AVD Manager overload

Change