【问题标题】:String to Array, Sort by 3rd Word/Column字符串到数组,按第三个字/列排序
【发布时间】:2018-01-11 07:47:24
【问题描述】:

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

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

【问题讨论】:

    标签: c# arrays visual-studio sorting


    【解决方案1】:

    试试这个代码:

    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,代码比它需要的要复杂一些。您将行拆分为一个数组,对其进行排序,然后重新组装 - 当您需要做的只是: .OrderBy(s => s.Split(' ')[2]);
    【解决方案2】:

    Aleks 得到了直截了当的答案 - 我只是想从另一个角度贡献一些东西。

    从学术角度来看,这段代码很好,只是从概念的角度来看。

    但是,如果您希望将其转化为业务开发人员的内容,您应该养成这样构建它的习惯:

    • 开发一个 Planet 类
    • 具有从源文本行返回行星的函数
    • 有一个功能可以显示你想要的星球 显示。

    这有很多原因,但最大的原因是您将拥有可重用、灵活的代码(看看您现在正在编写的函数 - 您能够重用的可能性有多大如果您有兴趣,请查看有关 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;
            }
        }
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-13
        • 1970-01-01
        • 2018-04-07
        • 1970-01-01
        • 2016-05-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多