[英]Finding a permutation from list<int> using linq
這似乎很容易,但是我遇到了一個又一個問題……我有一個需要置換搜索的搜索算法。 我有一個可提供Web服務的sql數據庫。 在我的控制器中,我有一個復雜的搜索算法,搜索選項之一是查找數據字段的排列。
數據將是一個整數列表,例如[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,但始終求值為搜索字符串一個零不是兩個零...
有人可以協助嗎?
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;
}
您可以使用簡單的Linq
語句。 使用“ Any
和All
擴展名並驗證組合。
// 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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.