2012-05-28 4 views
4

Я хочу сортировать фиксированный набор строк, таких как «Текстовые файлы», «Файлы изображений», «Аудиофайлы», «Видеофайлы», «Файлы приложений», «Другие файлы» в массив строк в том же порядке, о котором я упомянул.Сортировка массива строк в пользовательском порядке

Пример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"; 

Пожалуйста, может кто-нибудь мне помочь в достижении этой цели

+2

На каком основании вы хотите отображать эти массивы? –

+0

Вы имеете в виду, что 'Image files',' Text files' ... являются типами, а не строками? – Schaliasos

+0

Файлы изображений, текстовые файлы являются строковыми значениями. В основном я получаю пользовательский ввод как «Другие файлы, файлы изображений, текстовые файлы»; или с любой другой комбинацией, которую Im расщепляется на строковый массив (Split (';').но раз я разделяю, я хочу, чтобы значения массива были в том же порядке, как я упоминал. Пожалуйста, дайте мне знать, если все еще не ясно? –

ответ

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

Nikhil .. это не давало мне всех значений в массиве outputval .. –

+0

использовать 'StringComparer'' IgnoreCase' с методом' Contains' – Damith

+0

@ user671218 у вас есть 'файлы приложений' с простыми файлами' f', но fixed_array с ' Файлы приложений' с капиталом 'F' – Damith

1

Реализовать ICompare, а затем вы можете использовать OrderBy с ICompare, чтобы получить свой собственный вид. Проверка MSDN ICompare article

I.e. что-то вроде,

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

просто строки с числами прилагаемыми в начале и добавить его в отсортированный список.

как «0, текстовые файлы», «1, файлы изображений», «2, аудиофайлы», «3, видеофайлы», «4, файлы приложений», «4», «Другие файлы» «

, а затем, используя удалить строку перед», "..

7

Этот сырой реализации с использованием 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; 
     } 
    } 
} 
+0

Это работало как шарм .. Thnks Adam :) –

Смежные вопросы