2017-05-26 3 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に条件を追加:私が正しくあなたが望むものを理解していれば

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

ありがとうございました。 – DivideByzero

+2

@Ivan Stoev、私は自分のコードをチェックしました、dbコールはIEnumerbaleを返していますので、このロジックはメモリ操作です。この場合、エンティティフレームワークタグは本当に重要ではありません。 dbコールについて言えば、私のところは悪いです。 – DivideByzero

3

、参加それを行うだろう:

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

あなたの条件になり

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