我有一个包含数字,单词和换行符的字符串,我将其拆分为数组。
如果我运行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
答案 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得到了直截了当的回答 - 我只是想从另一个角度做出贡献。
这个代码很好,来自学者,只是学习概念的观点。
但是,如果您希望将其转化为商业开发者的某些内容,那么您应该养成如下结构的习惯:
这有很多原因,但最重要的原因是你会拥有可重复使用的灵活代码(看看你现在正在写的功能 - 你有多大可能&#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