c#如何按照我想要的方式对数组进行排序?

时间:2015-09-12 17:29:16

标签: c# arrays sorting

如何在我想要对它们进行排序的元素之后对数组进行排序? 到目前为止,这是我的代码:

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());
}

现在正在对它进行排序:

unsorted list

但是我希望它如此排序,如Rcs Enabled,Rcs Start After,Rcs Force Max,Rcs Force Min等儿子......

正如您现在所看到的,我使用了OrderBy并尝试使用OrderByDesencding 但它不按照我想要的方式订购列表。我可以以某种方式硬编码我想如何排序数组?

3 个答案:

答案 0 :(得分:0)

  

但是我希望它如此排序,如Rcs Enabled,Rcs Start After,Rcs Force Max,Rcs Force Min等儿子......

听起来你有一些想要输入条目的任意顺序。 LINQ的OrderBy等内置方法,甚至普通的List.Sort只会帮助您,只要您对订单有一些实际的定义。

因此,如果您没有订单,可以通过查看价值来确定(即按字母表排序,或者使用您可以使用的通用模式),那么您唯一的机会就是实施订单完全是你自己。

您有多种方法可以做到这一点:

  1. 您可以创建从条目到数字的映射,其中数字反映有序序列中的位置。例如,制作一个字典,将每个可能的单词映射到一个数字:

    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]);
    
  2. 您还可以根据需要创建一个完全按顺序排列的简单列表。然后,您只需将已排序的完整列表与您的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));
    
  3. 可能还有其他解决方案,但除非您有某种自动方式来确定两个任意键之间的顺序,否则您必须以某种方式明确定义它。

答案 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; }
    }
}
​