簡體   English   中英

從列表中查找排列 <int> 使用LINQ

[英]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語句。 使用“ 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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM