2012-03-08 44 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; 
相關問題