2009-06-02 222 views
8

我已經超過一千文件夾,每個文件夾包含一個或多個文件名稱如下:自定義的LINQ訂購

無序:

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

有序:

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

我想如上所述寫一個表達式來對這個列表進行排序。

回答

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 [項目[0],你可以有一個關心邊緣的情況下(不存在字母一個不錯的輔助方法,空,等Ø N)。但是,這是主意。

+0

@Yann施瓦茨:這些只是模擬的文件名,字母鍵我想使用的是文件的第一個字母。謝謝! – Chris 2009-06-02 21:51:57

+0

對不起。我以爲你想要一個自定義的字母順序(我見過陌生的東西:-)) – 2009-06-02 21:54:59

+0

這不是他想要的嗎?我認爲他也想這樣.. – 2009-06-02 21:58:18

0

你沒有提到你在列表中究竟什麼樣的對象,但讓我們說這是像這樣一些通用的安排:給定一個IEnumerable叫,說,files

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

然後,你可以只是做:

var result = files.OrderBy(f => f.FileName); 
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的東西,你問:-)

編輯: 我剛纔看到的編輯您的文章,現在我沒有任何想法了你真正想做的事,所以我的代碼可能是沒用的,你..

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; 
} 
012產生密鑰的方法

以下是如何稱呼它:

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

你可以期望的順序列表

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

說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訂單上你的列表,讓上你的期望列表

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