2012-03-08 72 views
1

如何使用LINQ来选择一些符合以下条件,
我要选择的话只包含在ArStr [],将字符串即A,B,C
在词表,“aabb”不包含“c”,“aacc”不包含“b”,“aabbccd”包含“d”。
所以他们不是我想要的字。
请帮忙。
如何使用LINQ选择一些包含字符串[]

Wordslist: 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; 
+3

*什么问题*?你的代码看起来完全合理,但如果你觉得它解决了问题,你就不会问这个问题。你没有说过什么是错的;有什么问题? – 2012-03-08 05:15:25

+0

@EricLippert问题在于他写错的代码在结果序列中包含“aabbccd”。 – phoog 2012-03-08 05:20:27

+0

是ArStr'的'所有元素保证是一个字符长? – phoog 2012-03-08 05:20:53

回答

1

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

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

'新的HashSet (ArStr)'将无法工作,因为ArStr是'IEnumerable的''不IEnumerable的'。但是,如果该数组中的所有元素都是单字符字符串,则该修正很简单。如果他们*不被保证拥有一个角色,那么问题就更难解决了。 – phoog 2012-03-08 05:19:31

+0

ArStr []是一个字符串数组包含单个字符的8种元素,还包含空即“”,当转换数组字符,因为s为null时发生错误。错误参数1:无法从'string []'转换为'System.Collections.Generic.IEnumerable ' – oreing 2012-03-08 07:14:04

1

正如你可能已经注意到了,你写查询确实回报 “aabbccd”,因为该字符串包含 “一”,它包含了 “B”,它包含“c”。

假设ArStr只能包含一个字符字符串,并要返回包含只有指定字符的字符串,所以你应该说(改编自阿尼的答案):

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

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

+0

ArStr []是一个字符串数组包含8个单个字符的元素,也包含空的ie“”,转换时将数组转换为字符,因为s为null而发生错误。 – oreing 2012-03-08 07:03:32

+0

@oreing第一,'null'是不一样的空字符串(' “”')。其次,为什么你的数组中有那个字符串?询问''“''是否是'”aabbccd“'的子串是什么意思?所有字符串的答案必须相同,不管是“是”还是“否”,具体取决于您如何设置问题。 – phoog 2012-03-12 19:59:21

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(); 
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); 
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; 
相关问题