2016-08-12 4 views
0

これは簡単だと思われるが、別の問題の後に1つの問題にぶつかりました...私は置換検索が必要な検索アルゴリズムを持っています。私は最大のWebサービスを提供するSQLデータベースを持っています。私のコントローラには複雑な検索アルゴリズムがあり、検索オプションの1つはデータフィールドの順列を見つけることです。リスト<int>からの置換リストの検索linqを使用して

データは[0,0,9,3,8,7,4] ...のような整数のリストになります。検索基準は、[9,4,7 ] ...この場合、置換が存在し、linqクエリで評価がtrueを返すはずです。

私は、真偽を返す "ブール値"関数を書いて、置換が存在するかどうかを評価しようとしています...これまでの例2と3の両方がtrueを返す場合を除いて、 ...彼らは1つのゼロのために評価されるので、2つのゼロの量があるわけではありません...それが合理的であれば?

[0,0,9,3,8,7,4] => [9,4,7] = true 
[0,0,9,3,8,7,4] => [0,0,2] = false 
[0,0,9,3,8,7,4] => [9,0,0] = true 

私は右...動くはずです、私のキーとカウントのリストを与えるであろう、「GROUPBY」を試してみましたか? #1では配列に9,4,7が含まれています...他の2つは配列に2つのゼロと残りの数字が含まれていますか?これは常にtrueと評価されますが、検索文字列には1つのゼロではなく2つのゼロ...

誰でも手助けできますか?

+0

をネストされたパーツを使用することができ、それが実際に順列の問題ではありません。あなたは単にセットBがセットAのサブセットであるかどうかを知りたいだけです。 –

+0

あなたが書いたコードを共有しますか? – kurakura88

答えて

1
public bool IsPermutation(IEnumerable<int> list,IEnumerable<int> subList) 
    { 
     var grpListCnt = list.GroupBy(num => num).ToDictionary(grp => grp.Key, grp => grp.Count()); 
     var subGroupCount = subList.GroupBy(num => num).ToDictionary(grp => grp.Key, grp => grp.Count()); 

     foreach(var keypair in subGroupCount) 
     { 
      if (!(grpListCnt.ContainsKey(keypair.Key) && 
           grpListCnt[keypair.Key] >= keypair.Value)) 
       return false; 
     } 
     return true; 
    } 
-1

簡単なLinqステートメントを使用できます。 AnyAllの拡張子を使用し、組み合わせを検証します。場合

// input 
int[][] data = ... 
int[] criteria = ... 

bool matchFound = data.Any(x=> criteria.All(c=> x.Contains(c)); 

ソース・データが1次元配列の場合(下図のように)私は理解してきたように、あなたは、単に

// input 
int[] data = ... 
int[] criteria = ... 

bool matchFound = criteria.All(c=> data.Contains(c)); 
+0

なぜデータのギザギザの配列ですか? – kurakura88

+0

私はOPの例からそれを選んだが、完全にはわからない。他のオプションについても言及してみると、質問が更新されます。 –

+0

なぜ投票が遅れますか?私たちは答えを改善することができるあなたのコメントを残す。 –

関連する問題