2011-10-13 182 views
5

我有一個文件名集合,其中一部分路徑名是特定的單詞。我可以爲了這樣的集合:根據另一個集合對集合進行排序

var files = from f in checkedListBox1.CheckedItems.OfType<string>() 
      orderby f.Substring(0,3) 
      select f; 

但現在,我想不是的路徑部分按字母順序排列,但根據其他集合給出了具體排序。

假設路徑名部分可以是「ATE」,「DET」和「RTI」。我有另一個字符串集合{{「DET」,「ATE」,「RTI」},我想用它來對文件名進行排序,以便排序後,文件名首先以「DET」 ,然後是「RTI」。我如何實現這一點 - >需要使用自己的比較器?

+0

(http://stackoverflow.com/questions/3355928/c-sharp-sort-list-based-on-another-list)基於另一個列表C#排序列表]的可能重複 – nawfal

回答

2

三種不同的變化,這取決於如果你想使用string[]List<string>Dictionary<string, int>(良才,如果你有很多的元素來搜索)

string[] collection = new[] { "DET", "ATE", "RTI" }; 
var files = from f in checkedListBox1.CheckedItems.OfType<string>() 
      orderby Array.IndexOf(collection, f.Substring(0, 3)) 
      select f; 

List<string> collection2 = new List<string> { "DET", "ATE", "RTI" }; 
var files2 = from f in checkedListBox1.CheckedItems.OfType<string>() 
      orderby collection2.IndexOf(f.Substring(0, 3)) 
      select f; 

Dictionary<string, int> collection3 = new Dictionary<string, int> 
      { { "DET", 1 }, { "ATE", 2 }, { "RTI", 3 } }; 

Func<string, int> getIndex = p => 
{ 
    int res; 
    if (collection3.TryGetValue(p, out res)) 
    { 
     return res; 
    } 
    return -1; 
}; 

var files3 = from f in checkedListBox1.CheckedItems.OfType<string>() 
       orderby getIndex(f.Substring(0, 3)) 
       select f; 

我將補充說,LINQ沒有一個「通用」IndexOf方法,但你可以建立一個這裏寫的How to get index using LINQ?

6

這應該工作

var files = from f in checkedListBox1.CheckedItems.OfType<string>() 
     orderby anotherCollection.IndexOf(f.Substring(0,3)) 
     select f; 
+0

只有當'anotherColletion'是'List ':-)(或者其他一些具有'IndexOf'實例方法的集合類型,例如數組沒有它) – xanatos

0

如果您的問題與您的狀態一樣簡單,並且只有3個可能的前綴,您可以執行此操作。

var fileNames = checkedListBox1.CheckedItems.OfType<string>(); 
var files = fileNames.OrderBy(f => 
{ 
    int value = int.MaxValue; 
    switch (f.Substring(0, 3)) 
    { 
     case "DET": 
      value = 1; 
      break; 
     case "ATE": 
      value = 2; 
      break; 
     case "RTI": 
      value = 3; 
      break; 
    } 
    return vakue; 
}); 
相關問題