Finding a permutation from list<int> using linq

本文关键字:int gt using linq lt from list Finding permutation | 更新日期: 2023-09-27 18:02:16

这似乎很容易,但我遇到了一个又一个问题…我有一个搜索算法需要进行排列搜索。我有一个sql数据库,提供了一个web服务。在我的控制器中,我有一个复杂的搜索算法,其中一个搜索选项是查找数据字段的排列。

数据将是一个整数列表,如[0,0,9,3,8,7,4]…搜索条件也会以整数列表的形式出现,如[9,4,7]…在这种情况下,排列存在,并且在linq查询中求值应该返回true。

所以我一直试图写一个"布尔"函数,将返回真或假来评估是否存在排列…到目前为止,我的尝试都是有效的,除了下面的例子2和3都返回true…因为它们被求值是因为一个0,而不是因为有两个0…这有道理吗?

[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…对于另外两个,数组是否包含两个零和剩下的数字…这总是求值为真,但总是求值搜索字符串包含一个零,而不是两个零…

有人能帮忙吗?

Finding a permutation from list<int> using linq

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