按自定义顺序对字符串数组进行排序

本文关键字:排序 数组 字符串 自定义 顺序 | 更新日期: 2023-09-27 18:35:34

我想按照我提到的相同顺序在字符串数组中对一组固定的字符串进行排序,例如"文本文件"、"图像文件"、"音频文件"、"视频文件"、"应用程序文件"、"其他文件"。

示例 1,如果我的字符串数组输入是这样的

inputval[0] = "Other files";
inputval[1] = "Image files";
inputval[2] = "Text files";

我的输出数组应该有这样的值

outputval[0] = "Text files";
outputval[1] = "Image files";
outputval[2] = "Other files";

示例 2,如果我的字符串数组输入是这样的

inputval[0] = "Application files";
inputval[1] = "Image files";
inputval[2] = "Video files";

我的输出数组应该有这样的值

outputval[0] = "Image files";
outputval[1] = "Video files";
outputval[2] = "Application files";

请有人帮助我实现这一目标

按自定义顺序对字符串数组进行排序

这种粗略的实现使用IComparer<string>提供给Array.Sort工作。有各种潜在的缺点,但我会把这些留给你(比如字符串需要完全匹配,否则它们将无法正确排序)。

它只是使用表示正确顺序的字符串的内部列表,然后将它们在该列表中的序号相互比较。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication61
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] files = new[] { "Audio Files", "Text Files", "Video Files", "Other Files", "Application Files" };
            Array.Sort(files, new FileComparer());
            Console.Read();
        }
    }
    class FileComparer : IComparer<string>
    {
        static List<string> OrderedFiles = new List<string> { "Text Files", "Image Files", "Audio Files", "Video Files", "Application Files", "Other Files" };
        public int Compare(string x, string y)
        {
            int xi = OrderedFiles.IndexOf(x);
            int yi = OrderedFiles.IndexOf(y);
            if (xi > yi)
                return 1;
            if (xi < yi)
                return -1;
            return 0;
        }
    }
}
因为从

你想要什么中不是很清楚。所以我考虑到inputval不会有重复.

string[] fixed_array =  { "Text files", "Image files", "Audio files", 
                        "Video files", "Application Files", "Other files" };

让我们说

inputval[0] = "Other files";
inputval[1] = "Image files";
inputval[2] = "Text files";

这样做

string[] outputval =
          fixed_array.Select(x => inputval.Contains(x) ? x : "-1")
                     .Where(x => x != "-1").ToArray();

所以outputval将是

outputval[0] = "Text files";
outputval[1] = "Image files";
outputval[2] = "Other files";

实现一个ICompare,然后您可以将OrderByICompare一起使用来获取自定义排序。 查看 MSDN ICompare 文章

即类似的东西,

public class MyCompare : ICompare<string>
{
    // Because the class implements IComparer, it must define a 
    // Compare method. The method returns a signed integer that indicates 
    // whether s1 > s2 (return is greater than 0), s1 < s2 (return is negative),
    // or s1 equals s2 (return value is 0). This Compare method compares strings. 
    public int Comapre(string s1, string s2)
    {
        // custom logic here
    }
}

只需在开头附加数字的字符串并将其添加到排序列表中即可。

如"0,文本文件","1,图像文件","2,音频文件","3,视频文件","4,

应用程序文件","4,其他文件"

然后在使用时删除","..