如何使用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;

如何使用LINQ select something contain string[]

您可以构建白名单字符的,然后过滤那些设置为与该白名单相等的单词(忽略重复项和顺序)。

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;