Сортировка списка с помощью C # * Не по алфавиту *

1

С С# я мало что знаю. При этом мне поручили проект по сортировке списка на основе последней версии jQuery в папке, где хранится множество версий.

В настоящее время это то, что у меня есть:

public ActionResult Index()
{
    //creating a DirectoryInfo object
    DirectoryInfo mydir = new DirectoryInfo(@"\\edcapptest\E$\cdn\js\jquery");

    // getting the files in the directory
    FileInfo[] f = mydir.GetFiles();

    List<string> myList = new List<string>();
    foreach (FileInfo file in f)
    {
        myList.Add(file.Name);
    }
    myList.Sort();
    return View(myList);
}

Я думал о том, как я могу это сделать в течение нескольких дней, и придумал практически никаких результатов (по крайней мере, те, которые работают).

Любые предложения или помощь будут очень благодарны.

Теги:
list
sorting

4 ответа

1
Лучший ответ

Предполагая, что алфавитный порядок поставит его в правильном порядке... ваш код, чтобы получить упорядоченный список, может выглядеть так...

Я использую синтаксис метода LINQ и прокомментирую каждую строку, так как вы упомянули, что не знаете много о С#.

public ActionResult Index()
{
    //creating a DirectoryInfo object
    DirectoryInfo mydir = new DirectoryInfo(@"\\edcapptest\E$\cdn\js\jquery");

    // getting the files in the directory
    var myList = mydir.GetFiles()  // Your objects in the list you start with
        // Filter for the jquery files... you may not need this line
        .Where(file => file.Name.StartsWith("jquery-"))
        // Select the filename and version number so we can sort  
        .Select(file => new { Name= file.Name, Version = GetVersion(file.Name)}) 
        // OrderBy the version number
        .OrderBy(f => f.Version)
        // We have to select just the filename since that all you want
        .Select(f => f.Name)
        // Convert your output into a List 
        .ToList();                 

    return View(myList);
}

    // GetVersion code and regex to remove characters...
    private static Regex digitsOnly = new Regex(@"[^\d]");
    public static Version GetVersion(string filename)
    {
        var versionNumbers = new List<int>();
        var splits = filename.Split('.');
        foreach (var split in splits)
        {
            var digits = digitsOnly.Replace(filename, "");
            if (!string.IsNullOrEmpty(digits))
                versionNumbers.Add(int.Parse(digits));
        }
        // Create a version which can have various major / minor versions and 
        //   handles sorting for you.
        return new Version(versionNumbers[0], versionNumbers[1], 
                       versionNumbers[2]);
    }
  • 0
    В настоящее время это то, что я вижу: jquery-1.10.2.min.js jquery-1.11.0.min.js jquery-1.5.1.min.js Мне нужно, чтобы jquery-1.11.0.min.js был первый результат, который показывают в списке
  • 2
    @StevenSmith, как выглядят ваши имена файлов, и я могу добавить код, который удаляет номера версий из строк, чтобы отсортировать их.
Показать ещё 4 комментария
0

Я создал класс для выполнения всей работы для меня, но вам не нужно это делать, мне просто легче. Я использую регулярное выражение, чтобы вытащить номер версии из имени файла, а затем разделил его на 3 целых части номера версии.

public class JQueryVersion
{
    public string File_Name { get; set; }

    public string Version
    {
        get
        {
            return Regex.Match(this.File_Name, @"jquery-([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2})\.").Groups[1].Value;
        }
    }       

    public int[] Version_Numeric
    {
        get
        {
            return this.Version.Split('.').Select(v => int.Parse(v)).ToArray();
        }
    }

    public JQueryVersion (string File_Name)
    {
        this.File_Name = File_Name;
    }
}

Затем вы можете создать и отсортировать список объектов JQueryVersion следующим образом:

List<JQueryVersion> Data = new List<JQueryVersion>()
{
    new JQueryVersion("jquery-1.10.2.min.js"),
    new JQueryVersion("jquery-1.11.0.min.js"),
    new JQueryVersion("jquery-1.5.1.min.js"),
    new JQueryVersion("jquery-1.6.1.min.js"),
    new JQueryVersion("jquery-1.6.2.min.js"),   
};

var Sorted_Data = Data
    .OrderByDescending (d => d.Version_Numeric[0])
    .ThenByDescending (d => d.Version_Numeric[1])
    .ThenByDescending (d => d.Version_Numeric[2]);
0

не предназначенное для полного решения, но это должно вас закрыть.

    public List<jquery> GetVersion(string path)
    {

        var thelist = (from afile in System.IO.Directory.EnumerateFiles(path)
            let version = removeLetters(afile)
            select removeLetters(afile).Split('.')
            into splitup
            select new jquery()
            {
                Filename = filename,
                //will want to add some additional checking here as if the length is not 3 then there will be other errors.
                //just a starting point for you
                Major = string.IsNullOrWhiteSpace(splitup[0]) ? 0 : int.Parse(splitup[0]), 
                Minor = string.IsNullOrWhiteSpace(splitup[1]) ? 0 : int.Parse(splitup[1]), 
                Build = string.IsNullOrWhiteSpace(splitup[2]) ? 0 : int.Parse(splitup[2]),
            }).ToList();

        return thelist
            .OrderByDescending(f => f.Major)
            .ThenByDescending(f => f.Minor)
            .ThenByDescending(f => f.Build)
            .ToList();
    }

    public string removeLetters(string value)
    {
        var chars = value.ToCharArray().Where(c => Char.IsNumber(c) || c.Equals('.'));
        return chars.ToString();
    }

    public class jquery
    {
        public string Filename { get; set; }
        public int Major { get; set; }
        public int Minor { get; set; }
        public int Build { get; set; }
    }
  • 0
    Уже есть класс Version который вы можете использовать, он также имеет встроенную сортировку по основным, второстепенным, встроенным.
  • 0
    @TimSchmelter да, это правда, но я проверил атрибуты файла для файла jQuery, не похоже, что это было установлено.
Показать ещё 2 комментария
0

Я использую сортировку (сравнение <T>) для самодельных сравнений:
http://msdn.microsoft.com/en-us/library/w56d4y5z%28v=vs.110%29.aspx

Ниже приведен пример сравнения дат изменения файлов:

public ActionResult Index()
{
    //creating a DirectoryInfo object
    DirectoryInfo mydir = new DirectoryInfo(@"\\edcapptest\E$\cdn\js\jquery");

    // getting the files in the directory
    FileInfo[] f = mydir.GetFiles();

    List<string> myList = new List<string>();
    foreach (FileInfo file in f)
    {
        myList.Add(file.Name);
    }
    myList.Sort(SortByModificationDate);
    return View(myList);
}

public int SortByModificationDate(string file1, string file2)
{
    DateTime time1 = File.GetLastWriteTime(file1);
    DateTime time2 = File.GetLastWriteTime(file2);
    return time1.CompareTo(time2);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню