2013-04-29 32 views
11

Tôi muốn đặt hàng Danh sách chuỗi nhưng một chuỗi trong danh sách phải luôn ở đầu và không được sắp xếp. Cách dễ nhất để làm điều này với LINQ là gì?Danh sách sắp xếp ngoại trừ một mục nhập với LINQ

//should be ordered in: first, a,b,u,z: 
List<string> l = {"z","u","first","b","a"}; 

Không có phương thức prepend hoặc thứ gì đó trong LINQ, phải không?

Trả lời

19
l = l.OrderBy(i => i != "first").ThenBy(i => i).ToList(); 

Bí quyết ở đây là đặt hàng cho dù mục được đề cập là mặt hàng đặc biệt của bạn, sau đó đặt hàng theo mặt hàng của bạn như bình thường.

Vì bạn đã nói rằng bạn muốn đặt hàng danh sách (với LINQ) đừng quên gán kết quả truy vấn vào danh sách.


Bạn cũng được hỏi về một phương pháp thêm vào trước, làm thế nào về điều này:

l = new[] { "first" }.Concat(l).ToList(); 

Bạn có thể dễ dàng làm cho nó một phương pháp khuyến nông:

public static class LinqExtensions 
{ 
    public static IEnumerable<T> Prepend<T>(this IEnumerable<T> query, T item) 
    { 
     return new[] { item }.Concat(query); 
    } 
} 

gọi là:

l = l.Prepend("first").ToList(); 
+1

'i = "đầu tiên" 'làm cho tôi mỉm cười':) ' –

+0

đó là mọt sách hài hước;) – daniel

+0

thế nào về! , nếu chúng ta có 2 hoặc nhiều mục được miễn? – WantIt

4

Bạn có thể sử dụng OrderBy, ThenBy mẫu:

string[] l = { "z", "u", "first", "b", "a" }; 

var result = l.OrderBy(i => i != "first").ThenBy(i => i); 
1

Đặt hàng theo hai tiêu chí. Các tiêu chí đầu tiên được dựa trên một số loại vị, thứ hai về giá trị của các mặt hàng:

[TestMethod] 
public void TestMethod1() 
{ 
    var list = new[] { "z", "u", "first", "b", "a" }.OrderByPredicateFirst(s => s == "first").ToList(); 
    Assert.AreEqual("first", list[0]); 
    Assert.AreEqual("a", list[1]); 
    Assert.AreEqual("b", list[2]); 
    Assert.AreEqual("u", list[3]); 
    Assert.AreEqual("z", list[4]); 
} 

public static class Extensions 
{ 
    public static IEnumerable<T> OrderByPredicateFirst<T>(this IEnumerable<T> source, Predicate<T> firsts) 
    { 
     return source 
      .OrderBy(s => firsts(s) ? 0 : 1) 
      .ThenBy(s => s); 
    } 
} 
Các vấn đề liên quan