使用linq从list <int>中查找排列

时间:2016-08-12 00:09:46

标签: c# linq

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

数据将是[0,0,9,3,8,7,4]等整数列表...搜索条件也将作为整数列表,如[9,4,7] ...在这种情况下,存在排列,并且评估应该在linq查询中返回true。

所以我一直试图写一个&#34; boolean&#34;函数将返回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

我已经尝试了#34; GroupBy&#34;,它会给我一个键和计数列表,这应该有用......对吗?在#1中,数组包含9,4和7 ...对于另外两个,数组是否包含,两个零和剩余的数字...这总是评估为true但总是评估搜索字符串包含单个零而不是两个零...

有人可以帮忙吗?

2 个答案:

答案 0 :(得分: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 :(得分:-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));