2011-11-16 28 views
6

Có phương thức dựng sẵn .NET nào có thể giải quyết được kịch bản của tôi không?C# - Phân loại chuỗi theo chuỗi khác là helper

  1. Có một chuỗi các chuỗi cũ. { "Mark", "Tom", "Mat", "Mary", "Peter" }
  2. tôi sử dụng chuỗi "Ma" như sắp xếp chuỗi helper
  3. kết quả mảng của tôi là { "Mark", "Mary", "Mat", "Tom", "Peter" }

Tôi biết rằng chức năng giải quyết này sẽ là dễ dàng, nhưng I'am quan tâm là phương pháp như vậy tồn tại.

PS. Sử dụng .NET 4.0

+0

Các chuỗi có chỉ mục phù hợp cần được sắp xếp. Điều gì về các chuỗi khác, mà không có chuỗi phù hợp? Nếu bạn muốn, bạn có thể lọc ra tất cả các chuỗi phù hợp và sắp xếp chúng và cuối cùng nối thêm danh sách với các phần tử còn lại. –

+0

Lợi ích của việc phân loại các phần tử nào chỉ khớp với tiền tố được chỉ định trong khi để lại các phần tử khác trong thứ tự tương đối ban đầu của chúng? Do các yếu tố được sắp xếp luôn luôn kết thúc ở đầu? –

+0

Bài tập về nhà, nếu có, vui lòng gắn thẻ. –

Trả lời

17

Sử dụng .Net 3.5 (và cao hơn) OrderByDescendingThenBy phương pháp trong LINQ sẽ có thể làm những gì bạn muốn. ví dụ:

var ordered = strings.OrderByDescending(s => s.StartsWith("Ma")).ThenBy(s => s); 
+0

Brilliant: upvoted !! – Marco

+0

Thx exacly những gì tôi muốn :) – EOG

+0

Linq-fu của một người mạnh mẽ. +1 – ddysart

1

Tôi nghĩ rằng phương thức đó không tồn tại.
tôi giải quyết với điều này:

public static string[] Sort(this string[] list, string start) 
{ 
    List<string> l = new List<string>(); 
    l.AddRange(list.Where(p => p.StartsWith(start)).OrderBy(p => p)); 
    l.AddRange(list.Where(p => !p.StartsWith(start)).OrderBy(p => p)); 
    return l.ToArray(); 
} 

Vì vậy, bạn có thể làm

string[] list = new string[] { "Mark", "Tom", "Mat", "Mary", "Peter" }; 
string[] ordered_list = list.Sort("Ma"); 

Nếu bạn cần phải đặt yếu tố với chuỗi bạn và để lại những người khác không được phân loại, sử dụng này:

public static string[] Sort(this string[] list, string start) 
{ 
    List<string> l = new List<string>(); 
    l.AddRange(list.Where(p => p.StartsWith(start)).OrderBy(p => p)); 
    l.AddRange(list.Where(p => !p.StartsWith(start))); 
    // l.AddRange(list.Where(p => !p.StartsWith(start)).OrderByDescending(p => p)); 
    return l.ToArray(); 
} 
Các vấn đề liên quan