【问题标题】:Sort list of objects using natural sort使用自然排序对对象列表进行排序
【发布时间】:2017-09-03 16:48:26
【问题描述】:

我有课

class grpa
{
    public string file_name { get; set; }
    public string folder_name { get; set; }
}

我还有 2 个字符串列表。

List<string> actualfiles = new List<string>();
List<string> directoryfiles= new List<string>();

我正在使用枚举器来创建 grpa 类型的对象列表

IEnumerator enume1 = actualfiles.GetEnumerator();
IEnumerator enume2 = directoryfiles.GetEnumerator();

List<grpa> grp_list = new List<grpa>();
while ((enume1.MoveNext()) && (enume2.MoveNext()))
{
    grp_list.Add(new grpa
    {
      file_name = enume1.Current.ToString(),
      folder_name = enume2.Current.ToString() 
    });
}

我想使用自然排序对文件名之后的列表进行排序:
我有这个:

public static class SafeNativeMethods
{
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
    public static extern int StrCmpLogicalW(string psz1, string psz2);
}

public sealed class NaturalStringComparer : IComparer<string>
{
    #region IComparer<string> Members

    public int Compare(string x, string y)
    {
        return SafeNativeMethods.StrCmpLogicalW(x, y);
    }

    #endregion
}

如果它是一个普通的字符串列表,我可以使用:actualfiles.Sort(new NaturalStringComparer());
但是我怎样才能在file_name之后对grp_list进行排序呢?

【问题讨论】:

    标签: c# sorting natural-sort


    【解决方案1】:

    只使用 linq

    var sorted = grp_list.OrderBy(x=>x.file_name, new NaturalStringComparer ()).ToList();
    

    【讨论】:

      【解决方案2】:

      你可以再写一个IComparer,这次是IComparer&lt;grpa&gt;

      public sealed class GrpaComparer : IComparer<grpa>
      {
          public int Compare(grpa x, grpa y)
          {
              return SafeNativeMethods.StrCmpLogicalW(x.file_name, y.file_name);
          }
      }
      

      这样你就可以对你的列表进行排序:

      grp_list.Sort(new GrpaComparer());
      

      【讨论】:

        【解决方案3】:

        类似于L.B's answer,但不是使用 LINQ 对结果列表进行排序,而是使用 LINQ 一次完成所有工作,您对两个枚举执行的操作是 Zip

        List<grpa> grp_list = actualfiles.Zip(directoryfiles, 
                 (fileName, folderName) => new grpa { file_name = fileName, folder_name = folderName })
              .OrderBy(x=>x.file_name, new NaturalStringComparer())
              .ToList();
        

        【讨论】:

          【解决方案4】:

          您可以将 NaturalString 比较器包装为:

          public sealed class GrpaComparer : IComparer<grpa>
          {
              private IComparer<String> nsComparer;
          
              public GrpaComparer(IComparer<String> nsComparer) 
              {
                // Validate input for non-nullness
                this.nsComparer = nsComparer;
               }
          
              public int Compare(grpa x, grpa y)
              {
                  return this.nsComparer.compare (x.file_name, y.file_name);
              }
          }
          

          【讨论】:

            【解决方案5】:

            在排序和使用前尝试删除文件扩展名 List.Sort()。试一试可能会奏效。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-06-01
              • 1970-01-01
              相关资源
              最近更新 更多