2011-11-08 8 views
0

2つの入力セットAおよびBから派生したドメインからブール関数のリストにルールを適用するlinqクエリを作成しようとしています。LINQ to Objectsクエリを「中断する」ことは可能ですか?

しかし、だから私はAの各要素について最大でも1つの結果しか得られない。

これは味付けした機能的な人々には意味があると思う - 私の感覚は、物事の仕方その世界は、私は実際に正しい軌道にいるかどうかは分かりません...

ここにコードは、うまくいけば私がやっていることは明らかです:

その結果
List<int> a = new List<int>(); 
a.Add(1); 
a.Add(2); 
List<int> b = new List<int>(); 
b.Add(1); 
b.Add(2); 
Func<int, int, string> map = (i, j) => i + "->" + j; 
var rules = new List<Func<int,int,Tuple<bool, Func<int, int, string>>>>(); 
rules.Add((i, j) => new Tuple<bool, Func<int,int,string>>(i == j, (ii, jj) => map(ii, jj)));         
rules.Add((i, j) => new Tuple<bool, Func<int,int,string>>(i+j == 2, (ii,jj) => map(ii,jj)));        
var q = from ai in a 
     from bi in b 
     from rule in rules 
     let tuple = rule(ai, bi) 
     where tuple.Item1 == true 
     select tuple.Item2(ai, bi); 

1->1 

1->1 

2->2 

望ましい結果:私は最初のルール1-> 1と一致した場合に発生される持っているようをいただきたい何

1->1 

2->2 

、私ができます2番目の1-> 1を除外します。それは、私が基本ルールとフォールバックルールを順番に適用することができるようになりますが、余分なマッピングを生成しないようです。

答えて

3

それはあなたがMSDNからenumerable.TakeWhile(predicate)

例を探しているように聞こえる:

 string[] fruits = { "apple", "banana", "mango", "orange", 
           "passionfruit", "grape" }; 

     IEnumerable<string> query = 
      fruits.TakeWhile(fruit => String.Compare("orange", fruit, true) != 0); 

     foreach (string fruit in query) 
     { 
      Console.WriteLine(fruit); 
     } 

     /* 
     This code produces the following output: 

     apple 
     banana 
     mango 
     */ 
+0

ありがとう:

 var q = from ai in a from bi in b from rule in rules let tuple = rule(ai, bi) where tuple.Item1 == true select tuple.Item2(ai, bi); q = q.Distinct().ToArray(); 

がになります。各ルールを一意にそのルールの表現によって識別されますので、あなたは単に意味、出力に明確なを実行することができますとてもかっこいい。何らかの理由で私はTakeWhileについて知りませんでした。 – aevanko

1

の異なるが、出番はあります。

1->1 

2->2 

ではなく

1->1 

1->1 

2->2 
関連する問題