定制Linq订购

时间:2009-06-02 21:39:50

标签: c# linq c#-3.0

我有超过一千个文件夹,每个文件夹包含一个或多个具有以下名称的文件:

无序:

Alison.ext
Heather.ext
Molly.ext
Paula.ext
Sam.ext

序:

Molly.ext
Sam.ext
Heather.ext
Alison.ext
Paula.ext

我想写一个表达式来对这个列表进行排序,如上所述。

5 个答案:

答案 0 :(得分:14)

//Creating a dictionary with the custom order
var order = "MSHAP";
var orderDict = order.Select((c,i)=>new {Letter=c, Order=i})
                     .ToDictionary(o => o.Letter, o => o.Order);

var list = new List<string>{"A.ext", "H.ext", "M.ext", "P.ext", "S.ext"};

//Ordering by the custom criteria
var result = list.OrderBy(item => orderDict[item[0]]);

除了调用orderDict [item [0]]之外,您还可以使用一个很好的辅助方法来处理边缘情况(不存在的字母,null等)。但这就是想法。

答案 1 :(得分:6)

这是一个生成订购密钥的方法

public int OrderKey(string fileName)
{
  char first = fileName[0];
  int result =
     first  == 'M' ? 1 :
     first  == 'S' ? 2 :
     first  == 'H' ? 3 :
     first  == 'A' ? 4 :
     first  == 'P' ? 5 :
     6;
  return result;
}

以下是如何调用它:

List<File> ordered = Files.OrderBy(f => OrderKey(f.FileName)).ToList();

答案 2 :(得分:1)

List<char> sortKeys = new List<char> { 'M', 'S', 'H', 'A', 'P' };
sortKeys.Reverse();
List<FileInfo> files = new List<FileInfo>(6);

foreach(char sortKey in sortKeys)
{
    var topFiles = files.Where(file => file.Name.StartsWith(sortKey.ToString()));
    var remainingFiles = files.Except(topFiles);
    files = topFiles.Concat(remainingFiles).ToList();
}

未经测试,我确信有更快的方法,但至少跟你问的是linq的东西: - )

修改 我刚看到你帖子上的编辑,现在我不知道你真正想做什么,所以我的代码对你来说可能没用..

答案 3 :(得分:0)

你没有在列表中确切地提到你有什么类型的对象,但是让我们说这是一些通用的安排:

public class File {
  public string FileName { ... }
  public long FileSize { ... }
  /* elided */
}

然后,给定一个名为files的IEnumerable,您可以这样做:

var result = files.OrderBy(f => f.FileName);

答案 4 :(得分:0)

您可以将所需的订单列表存储在数组中

int[] iIndex = {3,2,0,4, 1};

Say str保存您的无序列表

List<string> str = new List<string>();
str.Add("Alison.ext");
str.Add("Heather.ext");
.
.
.

将您的清单和相应的订单添加到数据表中

DataTable dt = new DataTable();
                dt.Columns.Add("Order", typeof(Int32));
                dt.Columns.Add("Name");

                for (int iCount =0; iCount< str.Count ; iCount ++)
                { 
                    DataRow drow1 = dt.NewRow();
                    drow1[0] = iIndex[iCount];
                    drow1[1] = str[iCount];
                    dt.Rows.Add(drow1);

                }
                dt.AcceptChanges();

Fynally订购yuor列表以获得yuor预期列表

 var result = from ls in dt.AsEnumerable()
                         orderby ls.Field<int>("Order")
                         select ls;