2017-05-26 37 views
0

如何過濾列表,使過濾順序在輸出中保持不變。linq過濾使訂單保持不變

void Main() 
{ 
    var states = new List<State>() { new State("CA", "California"), 
            new State("NY", "New York"), 
            new State("AL", "Alabama"), 
            new State("NV", "Nevada")}; 
    var myOrder = new List<string>() {"AL", "NY"}; 

    var result = states.Where(s => myOrder.Exists(c => string.Equals(c, s.Code, StringComparison.OrdinalIgnoreCase))); 
    foreach(var res in result) 
    { 
     Console.WriteLine(res.Code); 
    } 
    //this outputs - NY AL 
} 

public class State 
{ 
    public string Code; 
    public string Name; 
    public State(string code, string name) 
    { 
     Code = code; 
     Name = name; 
    } 
} 

我需要輸出的順序與myOrder列表(預期輸出 - AL NY)中給出的順序相同。

+0

所以你想結果按字母順序? –

+0

然後根據myOrder而不是狀態查找狀態。這樣的排序是基於myOrder中的項目。 –

回答

1

添加條件OrderBy正確:

.OrderBy(s => myOrder.IndexOf(s.Code)); 

你的條件爲:

var result = states 
    .Where(s => myOrder.Exists(c => string.Equals(c, s.Code, StringComparison.OrdinalIgnoreCase))) 
    .OrderBy(s => myOrder.IndexOf(s.Code)); 

Dotnet Fiddle Demo

+1

這在L2E中不起作用。這就是爲什麼EF問題不應該與L2O例子混合「爲了代碼簡單」 –

+0

謝謝@degant,它的工作。 – DivideByzero

+2

@Ivan Stoev,我檢查了我的代碼,db調用正在返回一個IEnumerbale <>,所以這個邏輯是一個內存操作。在這種情況下,實體框架標籤並不重要。提到數據庫調用不好。 – DivideByzero

3

如果我理解正確,你想要什麼,一個連接會這麼做:

static void Main() 
{ 
    //below is a database call, for sake of code simplicity, I have hardcoded few data samples. 
    var states = new List<State>() { 
      new State("CA", "California"), 
      new State("NY", "New York"), 
      new State("AL", "Alabama"), 
      new State("NV", "Nevada") 
     }; 

    var myOrder = new List<string>() { "AL", "DE", "NY", "TX" }; 

    // Join myOrder... 
    var result = myOrder.Join(
     // to states... 
     states, 
     // ...on the whole myOrder item... 
     o => o, 
     // ...equals the Code field of the State 
     s => s.Code, 
     // And the result of the join is just the State 
     (o, s) => s); 

    // this outputs - AL NY 

    foreach (var res in result) 
    { 
     Console.WriteLine(res.Code); 
    } 
} 

使用myOrder訂購的最簡單方法就是從那裏開始,不要更改它。有很多方法可以做到這一點,但是這會起作用。

+0

謝謝@Ed Plunkett這是更優雅的解決方案! – DivideByzero