代码之家  ›  专栏  ›  技术社区  ›  Taranjit Kang

按对象列表排序

  •  0
  • Taranjit Kang  · 技术社区  · 8 年前

    我是根据文件名排序,但没有得到正确的结果。

    "552939_VVIDEO9.mp4"
    "552939_VVIDEO8.mp4"
    "552939_VVIDEO13.mp4"
    "552939_VVIDEO12.mp4"
    "552939_VVIDEO7.mp4"
    "552939_VVIDEO6.mp4"
    "552939_VVIDEO2.mp4"
    "552939_VVIDEO16.mp4"
    "552939_VVIDEO10.mp4"
    "552939_VVIDEO3.mp4"
    "552939_VVIDEO11.mp4"
    "552939_VVIDEO4.mp4"
    "552939_VVIDEO1.mp4"
    "552939_VVIDEO15.mp4"
    "552939_VVIDEO14.mp4"
    "552939_VVIDEO17.mp4"
    
    
      List<WfVideo> orderVideo = ProductData.Videos.OrderBy(o => o.Filename, StringComparer.InvariantCultureIgnoreCase).ToList();
    

    我得到的结果是:

    VOD1
    VOD2
    VVIDEO1
    VVIDEO10
    VVIDEO11
    VVIDEO12
    VVIDEO13
    VVIDEO14
    VVIDEO15
    VVIDEO16
    VVIDEO17
    VVIDEO2
    VVIDEO3
    VVIDEO4
    VVIDEO5
    VVIDEO6
    

    排序不正确吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Espen    8 年前

    如果只想在数字之后对这些文件进行排序,可以传递一个比较器来实现所需规则的排序。这将根据文件名的编号对其进行排序:

    List<string> files = new List<string>
        {
            "552939_VVIDEO9.mp4",
            "552939_VVIDEO8.mp4",
            "552939_VVIDEO13.mp4",
            "552939_VVIDEO12.mp4",
            "VOD1.mp4",
            "552939_VVIDEO6.mp4",
            "VOD2.mp4",
            "552939_VVIDEO2.mp4",
            "552939_VVIDEO16.mp4",
            "552939_VVIDEO10.mp4",
            "552939_VVIDEO3.mp4",
            "552939_VVIDEO11.mp4",
            "552939_VVIDEO4.mp4",
            "552939_VVIDEO1.mp4",
            "552939_VVIDEO15.mp4",
            "552939_VVIDEO14.mp4",
            "552939_VVIDEO17.mp4"
        };
            files.Sort((a, b) => {
                int an = 0;
                int bn = 1;
                var regex = new Regex("([0-9]+).mp4", RegexOptions.IgnoreCase);
                var aGroups = regex.Match(a).Groups;
                var bGroups = regex.Match(b).Groups;
                var aidx = aGroups.Count > 1 ? 1 : 0;
                var bidx = bGroups.Count > 1 ? 1 : 0;
                an = int.Parse(aGroups[aidx].Value);
                bn = int.Parse(bGroups[bidx].Value); 
                if (an == bn)
                    return 0;
                if (an < bn)
                    return -1;
                return 1;
            });
            foreach (var file in files)
            {
                Console.WriteLine(file);
            }
            Console.ReadKey();
    

    输出:

    VOD1.mp4
    552939_VVIDEO1.mp4
    VOD2.mp4
    552939_VVIDEO2.mp4
    552939_VVIDEO3.mp4
    552939_VVIDEO4.mp4
    552939_VVIDEO6.mp4
    552939_VVIDEO8.mp4
    552939_VVIDEO9.mp4
    552939_VVIDEO10.mp4
    552939_VVIDEO11.mp4
    552939_VVIDEO12.mp4
    552939_VVIDEO13.mp4
    552939_VVIDEO14.mp4
    552939_VVIDEO15.mp4
    552939_VVIDEO16.mp4
    552939_VVIDEO17.mp4
    

    注意:可能需要一些额外的错误检查。当然,您可以扩展这个比较器函数来处理您想要的任何规则。

    推荐文章