2016-08-12 37 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

为什么要投票?留下你的评论,我们可以改善答案。 –