如何使用LINQ选择包含字符串[]的东西

时间:2012-03-08 05:09:29

标签: c# linq

如何使用linq选择符合以下条件的内容,
我想选择单词JUST包含ArStr []中的字符串,即a,b,c
在Wordslist中,“aabb”不包含“c”,“aacc”不包含“b”,“aabbccd”包含“d”。
所以他们不是我想说的话 请帮忙。

单词列表: AABB AACC aaabbcc aabbbcc aabbccd

ArStr []: “一个” “B” “C”

预期查询: aaabbcc aabbbcc

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;

5 个答案:

答案 0 :(得分:1)

您可以构建一个 set 的白名单字符,然后过滤那些与该白名单相同的单词(忽略重复和顺序)。

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);

答案 1 :(得分:1)

正如您可能已经注意到的那样,您编写的的查询返回“aabbccd”,因为该字符串包含“a”,它包含“b”,并且包含“c”。

假设ArStr只能包含一个字符的字符串,并且您希望返回仅包含 指定字符的字符串,那么您应该说(改编自Ani的答案):

var chars = new HashSet<char>(ArStr.Select(s => s[0]));
var query = wordslist.Where(w => chars.SetEquals(w.Value));

但是,如果ArStr元素的长度可能超过一个字符,则需要更好地定义问题,解决方案将更加复杂。

答案 2 :(得分:0)

你可以试试这个:

    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();

答案 3 :(得分:0)

使用此方法评估单词是否超过您的条件:

    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);

答案 4 :(得分:0)

实现它的另一种方式。

我认为你可以在每个元素上使用String.Trim Method (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;