如何使用LINQ select something contain string[]
本文关键字:string contain something 何使用 LINQ select | 更新日期: 2023-09-27 18:27:17
如何使用linq选择符合以下条件的内容,
我想选择单词JUST包含ArStr[]中的字符串,即a、b、c
在Wordslist中,"aabb"不包含"c","aacc"不包含"b","aabbccd"包含"d"
所以它们不是我想要的词语
请帮忙
单词列表:aabbaaccaaabbccaabbbccaabbccd
ArStr[]:"a"b"c"
预期查询:aaabbccaabbbcc
IEnumerable<Word> Query =
from Word in Wordslist
where
Word.Value.Contains(ArStr[0]) // 1
&& Word.Value.Contains(ArStr[1]) // 2
&& Word.Value.Contains(ArStr[2]) // 3
select Word;
您可以构建白名单字符的集,然后过滤那些设置为与该白名单相等的单词(忽略重复项和顺序)。
var chars = new HashSet<char>(ArStr); // Construct white-list set
var query = from word in wordsList
where chars.SetEquals(word) // Word must be set-equal with white-list
select word;
或
var query = wordsList.Where(chars.SetEquals);
正如您可能已经注意到的,您编写的查询确实返回了"aabbccd",因为该字符串包含"a"、"b"answers"c"。
假设ArStr只能包含一个字符串,并且您希望返回仅包含指定字符的字符串,那么您应该说(改编自Ani的回答):
var chars = new HashSet<char>(ArStr.Select(s => s[0]));
var query = wordslist.Where(w => chars.SetEquals(w.Value));
然而,如果ArStr元素的长度可能超过一个字符,则需要更好地定义问题,并且解决方案将更加复杂。
使用此方法评估单词是否通过您的条件:
bool HasValidCharacters(string word)
{
var allowedCharacters = new List<string> { "a", "b", "c" };
return string.Join("", word.GroupBy(c => c)
.Select(g => g.Key)
.OrderBy(g => g))
.Equals(string.Join("", allowedCharacters.OrderBy(c => c)));
}
然后简单地调用方法来获得所需的列表:
var words = new List<string> { "aabb", "aacc", "aaabbcc", "aabbbcc", "aabbccd" };
var matchingWords = words.Where(HasValidCharacters);
你可以试试这个:
List<String> words = new List<string> { "aabb", "aacc", "aaabbcc", "aabbbcc", "aabbccd" };
List<string> allowed = new List<string> { "a", "b", "c" };
var lst = words.Where(word => allowed.All(a => word.Contains(a) && !Regex.IsMatch(word, "[^" + string.Join("", allowed) + "]"))).ToList();
只是实现它的另一种方法。
我认为你可以对每个元素使用String.Trim方法(Char.),然后空元素就是你想要的。
var arr = new string[] { "aabb", "aacc", "aaabbcc", "aabbbcc", "aabbccd" };
var arStr = new string[] { "a", "b", "c" };
var str = string.Join("", arStr);
var result = from p in arr
let arCharL = arStr.Select(a => Convert.ToChar(a)).ToArray()
let arCharR = p.ToCharArray()
where p.Trim(arCharL).Length == 0 && str.Trim(arCharR).Length == 0
select p;