2011-10-13 34 views
5

Tôi có một bộ sưu tập tên tệp với một phần của tên đường dẫn là một từ cụ thể. Tôi có thể đặt hàng các bộ sưu tập như thế này:Sắp xếp bộ sưu tập dựa trên một bộ sưu tập khác

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

Nhưng bây giờ, tôi muốn sắp xếp chứ không phải bằng thứ tự chữ cái trên một phần tên đường dẫn nhưng theo thứ tự cụ thể do sưu tập khác.

Vì vậy, giả sử phần tên đường dẫn có thể là "ATE", "DET" và "RTI". Tôi có một bộ sưu tập chuỗi khác: {"DET", "ATE", "RTI"} mà tôi muốn sử dụng để sắp xếp tên tệp để sau khi sắp xếp, tên tệp xuất hiện với tên riêng của chúng theo thứ tự "DET" trước, sau đó "ATE" , sau đó "RTI". Làm thế nào để đạt được điều này -> cần phải sử dụng một bộ so sánh riêng?

+0

thể trùng lặp của [C# Sắp xếp danh sách dựa trên Danh sách khác] (http://stackoverflow.com/questions/3355928/c-sharp-sort-list-based-on-another-list) – nawfal

Trả lời

2

Ba biến thể khác nhau, tùy thuộc nếu bạn muốn sử dụng string[], List<string> hoặc một Dictionary<string, int> (tốt chỉ khi bạn có những yếu tố NHIỀU để tìm kiếm)

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; 

tôi sẽ thêm LINQ không có phương thức "generic" IndexOf, nhưng bạn có thể tạo một cái như được viết ở đây How to get index using LINQ?

6

này nên làm việc

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

Chỉ khi 'anotherColletion' là một' Danh sách ':-) (hoặc một số loại bộ sưu tập khác có phương thức ví dụ' IndexOf'. Mảng ví dụ không có nó) – xanatos

0

Nếu vấn đề của bạn đơn giản như bạn nói và chỉ có 3 tiền tố có thể bạn có thể làm điều này.

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; 
}); 
Các vấn đề liên quan