2016-08-12 58 views
0

這似乎很容易,但我碰到了一個又一個問題......我有一個搜索算法,需要排列搜索。我有一個提供Web服務的sql數據庫。在我的控制器中,我有一個複雜的搜索算法,其中一個搜索選項是查找數據字段的排列。從列表<int>使用linq查找排列

該數據將是一個整數列表,如[0,0,9,3,8,7,4] ...搜索標準也將作爲一個整數列表[9,4,7 ] ...在這種情況下,排列存在,並且它的評估應該在linq查詢中返回true。

因此,我一直在試圖編寫一個「布爾」函數來返回true或false來評估是否存在排列......到目前爲止,我的嘗試已經工作,除非在下面的示例2和3都返回true的情況下...因爲它們是因爲單個零而被評估的,而不是有兩個零的數量......如果這是有道理的?

[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 ...對於另外兩個,數組是否包含兩個零和剩下的數字......這總是評估爲true,但始終評估搜索字符串包含一個零不是兩個零...

任何人都可以協助嗎?

+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)); 

在情況下,如果你的源數據是一個二維數組,你可以簡單地使用嵌套的部分(如下圖所示)

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

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

爲什麼參差不齊的數據? – kurakura88

+0

我從OP的例子中選擇它,並不完全確定。值得一提的其他選項,將更新問題。 –

+0

爲什麼要投票?留下你的評論,我們可以改善答案。 –