【问题标题】:How to check if a char array contains every element in another char array? [duplicate]如何检查一个char数组是否包含另一个char数组中的每个元素? [复制]
【发布时间】:2012-05-01 15:07:48
【问题描述】:

可能重复:
LINQ: Check whether an Array is a subset of another

我正在尝试确定是否有一种方法可以使用 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() 等内容。
  • 如果单词来自数组,您的代码实际上可以正常工作。问题是尝试将 LINQ to EF 转换为适当的查询无法处理ToCharArray() 等问题。您要么需要将整个单词列表拉入内存并在那里进行处理,要么实施更复杂的解决方案,例如我一周前回答的巧合的类似问题:stackoverflow.com/questions/10096744/…

标签: c# .net linq entity-framework linq-to-entities


【解决方案1】:

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

【讨论】:

  • 这会引发与我之前遇到的相同的错误。不过干净多了……
【解决方案2】:
char[] t1 = {'w','o','k','r','d','o'};

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

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

【讨论】:

  • 这会引发与我之前遇到的相同的错误。不过干净多了……
  • 我这边没有错误。在 isSubset 中填充 true
  • 阅读问题和 cmets 部分
猜你喜欢
  • 2017-03-03
  • 2022-01-09
  • 2021-01-30
  • 2021-06-04
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多