С С# я мало что знаю. При этом мне поручили проект по сортировке списка на основе последней версии 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);
}
Я думал о том, как я могу это сделать в течение нескольких дней, и придумал практически никаких результатов (по крайней мере, те, которые работают).
Любые предложения или помощь будут очень благодарны.
Предполагая, что алфавитный порядок поставит его в правильном порядке... ваш код, чтобы получить упорядоченный список, может выглядеть так...
Я использую синтаксис метода 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]);
}
Я создал класс для выполнения всей работы для меня, но вам не нужно это делать, мне просто легче. Я использую регулярное выражение, чтобы вытащить номер версии из имени файла, а затем разделил его на 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]);
не предназначенное для полного решения, но это должно вас закрыть.
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; }
}
Version
который вы можете использовать, он также имеет встроенную сортировку по основным, второстепенным, встроенным.
Я использую сортировку (сравнение <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);
}