2009-04-29 10 views
1

別の配列で定義された順序で文字列のコレクションを作成しようとしています。私は私のクライアントは、クライアントLINQ OrderBy help needed

{ 
[0][0] categoryX, 
[0][1] value from Category X, 
[1][0] something else, 
[1][1] value for something else, 
[2][0] category1, 
[2][1] value from Category 1 
} 
から渡された

すなわち、キーと値を含む文字列配列を渡す私は

requiredOrderOfElements

{ 
[0] category1, 
[1] categoryX, 
[2] something else 
} 

を説明しましょう知っている混乱に聞こえます

私が欲しいのは、 "価値"キー

のd順私は

[0]value from Category 1 
[1]value from Category X 
[2]value for something else 

何をしたい私は、[並べ替え/たIComparer見てきたと私は必要なものを実装するための明確な方法を見ることはできません。私の現在の解決策は、醜いネストされたforループです

よりエレガントな方法のアイデアをいただければ幸いです。

更新: - (ここで、彼らはしません)問題は、あなたが彼らのインデックスで順序付けされる文字列の配列を想定していることであるテスト

[TestFixture] 
public class GL_Linq_Test 
{ 
    [Test] 
    public void CanOrderByAnotherArray() 
    { 
     var requiredOrder=new[]{"my","required","order"}; 
     var passedFromClient = new[] 
            { 
             new[] {"required", "cat"}, 
             new[] {"order", "dog"}, 
             new[] {"my", "bird"} 
            }; 

     var ordered = FunkyOrderer.Order(requiredOrder, passedFromClient); 

     Assert.That(ordered.First()[1],Is.EqualTo("bird")); 
     Assert.That(ordered.Skip(1).First()[1], Is.EqualTo("cat")); 
     Assert.That(ordered.Skip(2).First()[1], Is.EqualTo("dog")); 
    } 
} 

public static class FunkyOrderer 
{ 
//returns order bird,dog,cat not bird,cat,dog   
public static IEnumerable<string[]> Order(string[] requiredOrder, IEnumerable<string[]>passedFromClient) 
    { 
     return from o in requiredOrder 
        join f in passedFromClient on o equals f[0] 
        orderby o 
        select f; 
    } 
} 
+1

@Gilly - これは理にかなった情報でもありません。いくつかのサンプルコードまたは各配列の実際の外観のレイアウトを投稿してください。 –

+0

うーん、他に何を入れるべきかわからない!私は下にテストを投稿し、それがそれ以上に良いかどうかを確認します。 – Gilly

答えて

2

です。 "my", "order", "required"の順序は、組み込みの文字列比較プログラムを使用すると正しいです。最も簡単な解決策は、注文時にインデックスを考慮に入れてLINQクエリを変更することです。

return from o in requiredOrder.Select((o, i) => new { Value = o, Index = i }) 
     join f in passedFromClient on o.Value equals f[0] 
     orderby o.Index 
     select f; 
+0

素晴らしい - ありがとう。 – Gilly

0
var orderByThese = new string[] { "category1", "categoryX", "something else" }; 

    var fromClient = new string[][] 
    { 
     new string[] { "categoryX", "value from Category X" }, 
     new string[] { "something else", "value for something else" }, 
     new string[] { "category1", "value from Category 1" } 
    }; 

    var joined = from o in orderByThese 
       join f in fromClient on o equals f[0] 
       orderby o 
       select f; 
+0

配列の最初の項目は正しく取得されませんが、他の2つは間違った方法です。私はテストを投稿します – Gilly

関連する問題