我有一个字符串,其中包含数字、单词和换行符,我将其拆分为数组。
如果我运行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
发布于 2017-08-03 15:39:47
试试下面的代码:
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);
}
编辑:谢谢@凯文!
发布于 2017-08-03 16:13:32
阿列克斯得到了一个直截了当的答案--我只是想从另一个角度做出一些贡献。
从学术角度来说,这段代码很好,只是从概念的角度来学习。
但是,如果您希望将其转换为业务开发,您应该养成这样的习惯:
这有很多原因,但最大的原因是,您将拥有可重用的、灵活的代码(看看您现在正在编写的函数--您是否有可能将其重新使用到其他方面?)如果您感兴趣,查找一些关于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;
}
}
编辑:修正了一些格式化问题
发布于 2017-08-03 15:40:44
您可以使用接受自定义比较器的Array.Sort
过载:
public class MyComparer : IComparer {
int IComparer.Compare( Object x, Object y ) {
//compare last parts here
}
}
https://stackoverflow.com/questions/45488713
复制相似问题