首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字符串到数组,按第3字/列排序

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

Stack Overflow用户
提问于 2017-08-03 15:33:47
回答 3查看 122关注 0票数 3

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

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

如何将数组按第3列( Color )按字母顺序排序?

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

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

代码语言:javascript
运行
复制
| Number     | Name       | Color      |
|------------|------------|------------|
| 1          | Mercury    | Gray       |
| 2          | Venus      | Yellow     |
| 3          | Earth      | Blue       |
| 4          | Mars       | Red        |

C#

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

代码语言:javascript
运行
复制
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());
}

所需的排序数组结果

代码语言:javascript
运行
复制
3 Earth Blue
1 Mercury Gray
4 Mars Red
2 Venus Yellow
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-03 15:39:47

试试下面的代码:

代码语言:javascript
运行
复制
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);
}

编辑:谢谢@凯文!

票数 4
EN

Stack Overflow用户

发布于 2017-08-03 16:13:32

阿列克斯得到了一个直截了当的答案--我只是想从另一个角度做出一些贡献。

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

但是,如果您希望将其转换为业务开发,您应该养成这样的习惯:

  • 发展行星类
  • 具有从源文本行返回行星的函数
  • 有一个函数来显示一个行星,你打算如何显示它。

这有很多原因,但最大的原因是,您将拥有可重用的、灵活的代码(看看您现在正在编写的函数--您是否有可能将其重新使用到其他方面?)如果您感兴趣,查找一些关于SRP (单一责任原则)的信息,以获得更多关于这一概念的信息。

这是代码的翻译版本:

代码语言:javascript
运行
复制
    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
EN

Stack Overflow用户

发布于 2017-08-03 15:40:44

您可以使用接受自定义比较器的Array.Sort 过载

代码语言:javascript
运行
复制
public class MyComparer : IComparer  {
      int IComparer.Compare( Object x, Object y )  {
          //compare last parts here
      }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45488713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档