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