如何在我想要对它们进行排序的元素之后对数组进行排序? 到目前为止,这是我的代码:
public override byte[] SaveSettings()
{
StringBuilder builder = new StringBuilder();
builder.AppendLine(@"#Smurf bot");
object[] keys = new object[GetKeys().Count];
GetKeys().CopyTo(keys, 0);
var keysSorted = keys.OrderBy(x => x);
foreach (string key in keysSorted)
{
builder.AppendFormat("{0} = {1}\n", key, GetValue(key));
}
return Encoding.Unicode.GetBytes(builder.ToString());
}
现在正在对它进行排序:
但是我希望它如此排序,如Rcs Enabled,Rcs Start After,Rcs Force Max,Rcs Force Min等儿子......
正如您现在所看到的,我使用了OrderBy
并尝试使用OrderByDesencding
但它不按照我想要的方式订购列表。我可以以某种方式硬编码我想如何排序数组?
答案 0 :(得分:0)
但是我希望它如此排序,如Rcs Enabled,Rcs Start After,Rcs Force Max,Rcs Force Min等儿子......
听起来你有一些想要输入条目的任意顺序。 LINQ的OrderBy等内置方法,甚至普通的List.Sort只会帮助您,只要您对订单有一些实际的定义。
因此,如果您没有订单,可以通过查看价值来确定(即按字母表排序,或者使用您可以使用的通用模式),那么您唯一的机会就是实施订单完全是你自己。
您有多种方法可以做到这一点:
您可以创建从条目到数字的映射,其中数字反映有序序列中的位置。例如,制作一个字典,将每个可能的单词映射到一个数字:
Dictionary<string, int> mapping = new Dictionary<string, int>()
{
{ "Rcs Enabled", 0 },
{ "Rcs Start After", 1 },
{ "Rcs Force Max", 2 },
{ "Rcs Force Min", 3 }
…
};
然后,您可以在OrderBy
:
keys.OrderBy(k => mapping[k]);
您还可以根据需要创建一个完全按顺序排列的简单列表。然后,您只需将已排序的完整列表与您的keys
列表进行比较。并筛选出keys
列表中不存在的值。这样,您可以从所有值的完全排序列表开始,最后得到keys
中相同的值,但保留顺序:
List<string> allKeysSorted = new List<string>()
{
"Rcs Enabled", "Rcs Start After", "Rcs Force Max", "Rcs Force Min",
…
};
var sortedKeys = allKeysSorted.Where(k => keys.Contains(k));
可能还有其他解决方案,但除非您有某种自动方式来确定两个任意键之间的顺序,否则您必须以某种方式明确定义它。
答案 1 :(得分:0)
您可以使用SortedDictionary类。
https://msdn.microsoft.com/en-us/library/f7fta44c%28v=vs.110%29.aspx
按密钥对字典进行排序。您可以使用构造函数中的自定义IComparer按自定义顺序排序。
https://msdn.microsoft.com/en-us/library/a045f865%28v=vs.110%29.aspx
答案 2 :(得分:0)
您需要定义订单。使用类似下面代码的类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
List<Setting> settings = new List<Setting>() {
new Setting() { name = "Trigger Burst Enabled", order = 1},
new Setting() { name = "Rcs Start After", order = 2},
new Setting() { name = "Trigger RCS", order = 4},
new Setting() { name = "Trigger Burst Shots", order = 5},
new Setting() { name = "Trigger Key", order = 7},
new Setting() { name = "Rcs Force Max", order = 4},
new Setting() { name = "Trigger Toggle", order = 3},
new Setting() { name = "Trigger Delay FirstShot", order = 4},
new Setting() { name = "Rcs Enabled", order = 5},
new Setting() { name = "Trigger Allies", order = 6},
new Setting() { name = "Trigger Enemies", order = 7},
new Setting() { name = "Trigger Enabled", order = 8},
new Setting() { name = "Rcs Force Min", order = 6},
new Setting() { name = "Trigger Hold", order = 3},
new Setting() { name = "Trigger Delay Shots", order = 4}
};
List<string> names = settings.OrderBy(x => x.order).Select(y => y.name).ToList();
}
}
public class Setting
{
public string name { get; set; }
public int order { get; set; }
}
}