使用自然排序对对象列表排序

时间:2017-09-03 16:48:26

标签: c# sorting natural-sort

我有一个班级

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() 
    });
}

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

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());
但是,如何在grp_list之后对file_name进行排序?

5 个答案:

答案 0 :(得分:4)

只需使用linq

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

答案 1 :(得分:3)

您可以写下另一个IComparer,这次IComparer<grpa>

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());

答案 2 :(得分:2)

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();

答案 3 :(得分:2)

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

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var nev: [String] = []   // Array is now inside the class
    var cim: [String] = []   // Array is now inside the class
    var ar: [String] = []   // Array is now inside the class

    var myIndex: Int?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    let row = (self.tableView.indexPathForSelectedRow as NSIndexPath?)?.row

    let vc = segue.destination as! SecondViewController

    vc.myIndex = row
    vc.nev = nev
    vc.cim = cim
    vc.ar = ar
}

class SecondViewController: UIViewController {

    var myIndex: Int?

    var nev: [String]?
    var cim: [String]?
    var ar: [String]?

答案 4 :(得分:0)

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