我已經超過一千文件夾,每個文件夾包含一個或多個文件名稱如下:自定義的LINQ訂購
無序:
Alison.ext Heather.ext Molly.ext Paula.ext Sam.ext
有序:
Molly.ext Sam.ext Heather.ext Alison.ext Paula.ext
我想如上所述寫一個表達式來對這個列表進行排序。
我已經超過一千文件夾,每個文件夾包含一個或多個文件名稱如下:自定義的LINQ訂購
無序:
Alison.ext Heather.ext Molly.ext Paula.ext Sam.ext
有序:
Molly.ext Sam.ext Heather.ext Alison.ext Paula.ext
我想如上所述寫一個表達式來對這個列表進行排序。
//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)。但是,這是主意。
你沒有提到你在列表中究竟什麼樣的對象,但讓我們說這是像這樣一些通用的安排:給定一個IEnumerable叫,說,files
public class File {
public string FileName { ... }
public long FileSize { ... }
/* elided */
}
然後,你可以只是做:
var result = files.OrderBy(f => f.FileName);
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的東西,你問:-)
編輯: 我剛纔看到的編輯您的文章,現在我沒有任何想法了你真正想做的事,所以我的代碼可能是沒用的,你..
下面是訂購
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();
你可以期望的順序列表
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;
@Yann施瓦茨:這些只是模擬的文件名,字母鍵我想使用的是文件的第一個字母。謝謝! – Chris 2009-06-02 21:51:57
對不起。我以爲你想要一個自定義的字母順序(我見過陌生的東西:-)) – 2009-06-02 21:54:59
這不是他想要的嗎?我認爲他也想這樣.. – 2009-06-02 21:58:18