C#排序脚本/从foreach中挑选最后一个Int

时间:2017-04-28 08:12:27

标签: c#

我的排序脚本需要一些帮助。我想排序一些文件。 这就是Name的构造方式:Name#Page#Version 我可以选择名称/类别和页面,但我不知道如何选择最新版本:/ 在这里你可以看到一个例子。 enter image description here

foreach(string files in Directory.GetFiles(path).OrderBy(fi => fi.Length))
        {
            try
            {
                filename = Path.GetFileNameWithoutExtension(files);


                index = filename.LastIndexOf("#");
                index2 = filename.LastIndexOf("#",index-1);

                strversion = filename.Substring(index+1);
                strpage = filename.Substring(index2+1);
                strpage = strpage.Substring(0, strpage.LastIndexOf("#"));                    

                page = Int32.Parse(strpage);
                version = Int32.Parse(strversion);
                Console.WriteLine("Page: "+page);
                Console.WriteLine("Version: "+version);

                if (filename.Contains("SMA"))
                {

                    if (page == 1)
                    {

                        Console.WriteLine(filename);

                    }
                }
            }
            catch (ArgumentOutOfRangeException e)
            {
                Console.WriteLine(e.Message);
            }
        }

3 个答案:

答案 0 :(得分:5)

您过度复杂化了,您可以将字符串拆分为#并从给定的数组中获取您想要的内容:

var fileName = "SMA#1#2";
var parts = fileName.Split('#');
var name = parts[0];
var page = parts[1];
var version = parts[2];

修改

至于为每个version获取最后一个page,您可能最好为您的文件创建某种类,然后按页分组,然后按版本排序,以及然后选择第一个:

public class Program
{
    public static void Main()
    {
        var fileNames = new[] { "SMA#1#1", "SMA#1#2", "SMA#1#3", "SMA#2#1", "SMA#2#3" };
        var files = (from fileName in fileNames select fileName.Split('#') into parts let name = parts[0] let page = Int32.Parse(parts[1]) let version = Int32.Parse(parts[2]) select new MyFile(name, page, version)).ToList();
        var grouped = files.GroupBy(x => x.Page).ToList();
        foreach (var group in grouped)
        {
            var ordered = group.OrderByDescending(x => x.Version);
            Console.WriteLine($"Page {group.Key} highest version: {ordered.First().Version}");
        }
    }
}

public class MyFile
{
    public string Name { get; set; }
    public int Page { get; set; }
    public int Version { get; set; }

    public MyFile(string name, int page, int version)
    {
        Name = name;
        Page = page;
        Version = version;
    }
}

答案 1 :(得分:1)

如果我正确理解您的要求,您需要

  1. 过滤掉每个不包含“SMA”的文件
  2. 然后按页面排序
  3. 然后按版本
  4. 你可以使用LINQ来完成声明:

    while ( !preg_match('/[0-9]/', $rand) && !preg_match('[a-z]',$rand )) { $rand = substr(md5(microtime()),rand(0,26),5) };
    

答案 2 :(得分:0)

int lastIndex = filename.LastIndexOf("#");
string version = fileName.SubString(lastIndex, fileName.Length - lastIndex);

这就是你要找的东西吗?