如何检查一个字符数组是否包含另一个字符数组中的每个元素?

3

可能重复:
LINQ:检查数组是否为另一个数组的子集

我正在尝试确定是否有一种方法可以使用LINQ查找子集数组中的每个元素是否都在超集数组中。例如,在这个超集中:

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

以下是一个有效的子集:
{'o','k','w','r'}

以下内容是无效的:

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

实际的超集是我在内存中拥有的字符数组。 实际的子集是数据库表中的一个值。 我正在尝试使用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();

但是当我运行这个程序时,我遇到了错误:
'无法创建类型为'System.Char'的常量值。在此上下文中,只支持基元类型(例如Int32、String和Guid)。
有没有办法解决这个错误?有没有更简单的方法来实现我在这里尝试的功能?

这个错误是由于查询还是由于LINQ to EF引起的?你正在查询哪些底层数据存储?它很可能不支持像ToCharArray()之类的东西。 - mellamokb
如果单词来自数组,您的代码实际上可以正常工作。问题在于尝试将其转换为适当的LINQ to EF查询时无法处理ToCharArray()等内容。您需要将整个单词列表加载到内存中并在那里处理它,或者实现一个更复杂的解决方案,就像我一周前偶然回答的类似问题:http://stackoverflow.com/questions/10096744/puzzle-solving-finding-all-words-within-a-larger-word-in-php/10096985#10096985 - mellamokb
2个回答

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

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

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

这会抛出之前我遇到的同样错误,但更加简洁了... - Abe Miessler
我的端没有错误。isSubset中填充了true。 - Nikhil Agrawal
阅读问题和评论部分 - Abe Miessler

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

这会抛出我之前遇到的相同错误,但更加简洁了... - Abe Miessler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接