4

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

Example1,如果我的字符串数组输入是这样的

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";

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

4

4 回答 4

8

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;
        }
    }
}
于 2012-05-28T09:15:36.267 回答
1

实现 anICompare然后您可以使用OrderBywith anICompare来获得您的自定义排序。查看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
    }
}
于 2012-05-28T09:07:58.247 回答
1

因为你想要的东西不是很清楚。所以我考虑到不会有重复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";
于 2012-05-28T09:09:03.017 回答
0

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

比如“0,文本文件”,“1,图像文件”,“2,音频文件”,“3,视频文件”,“4,应用程序文件”,“4,其他文件”

然后在使用时删除“,”之前的字符串..

于 2012-05-28T09:10:04.547 回答