2012-04-20 116 views
3

Possible Duplicate:
LINQ: Check whether an Array is a subset of another如何检查char数组是否包含另一个char数组中的每个元素?

我想确定是否有办法使用LINQ来查找子集数组中的每个元素是否在超集数组中。例如用此超集:

{'w','o','k','r','d','o'} 

下面将是一个有效的子集:

{'o','k','w','r'} 

虽然这些不会是有效的:

{'o','k','w','r','s'} 
{'w','o','k','r','d','o','s'} 

实际超集是char阵列我有记忆。实际的子集是数据库表中的一个值。我正尝试使用LINQ to EF来获取满足此条件的表中的所有值。这是我到目前为止已经试过:

char[] letterArray = letters.ToCharArray(); 
return we.Words.Where(t =>  letterArray.Join(t.Word.ToCharArray(), 
            f => f, 
            s => s, (f, s) => new { s }).Count() == t.Word.Length 
           ).Select(t => t.Word).ToArray(); 

但是当我运行此我得到的错误:

'Unable to create a constant value of type 'System.Char'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.'

有没有解决这个错误的方法吗?有没有更简单的方法来做我在这里尝试的?

+0

这是因为查询错误,还是因为LINQ到EF?你在查询什么底层数据存储?这很可能不会支持诸如'ToCharArray()'等东西。 – mellamokb 2012-04-20 02:19:41

+0

如果单词来自数组,那么你的代码实际上工作正常。问题是尝试转换为LINQ到EF的适当查询无法处理像ToCharArray()等东西。要么你需要把整个单词列表存入内存并在那里处理,或者实现一个更复杂的解决方案,就像我在一周前回答的巧合类似的问题:http://stackoverflow.com/questions/10096744/puzzle-solving-发现所有单词在一个较大的单词在PHP/10096985#10096985 – mellamokb 2012-04-20 02:27:11

回答

1
char[] t1 = {'w','o','k','r','d','o'}; 

char[] t2 = {'o','k','w','r'}; 

bool isSubset = !t2.Except(t1).Any(); 
+0

这引发了我以前得到的相同的错误。虽然更清洁... – 2012-04-20 02:28:20

+0

没有错误在我身边。在“isSubset”中填充true – 2012-04-20 03:12:31

+0

阅读问题和评论部分 – 2012-04-20 15:13:36

0

LINQ内置了像Except和Intersect这样的扩展的扩展。

char[] superset = { 'w', 'o', 'k', 'r', 'd', 'o' }; 
char[] subset1 = { 'o', 'k', 'w', 'r' }; 
char[] subset2 = { 'w', 'o', 'k', 'r', 'd', 'o', 's' }; 

bool subValid1 = !subset1.Except(superset).Any(); //true 
bool subValid2 = !subset2.Except(superset).Any(); //false 
+0

这引发了我之前得到的相同错误。虽然...更清洁 – 2012-04-20 02:28:46

相关问题