2012-03-08 1 views
1


私は言葉を選びたいが、JUST ArStrで
C []、すなわちA、B、内の文字列を含むどのようなものを選択するLINQを使用する含まれています"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

*質問は何ですか?あなたのコードは完全に合理的に見えますが、あなたはそれが問題を解決したことを感じた場合は、質問をされることはありません。あなたは何が間違っているかは言わなかった。どうしたの?問題@EricLippert –

+0

は、彼が書かれているコードは間違って結果シーケンス内の「aabbccd」を含むことです。 – phoog

+0

'ArStr'のすべての要素は1文字長であることが保証されていますか? – phoog

答えて

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 'です。しかし、配列内のすべての要素が1文字の文字列であれば、修正は簡単です。 1人のキャラクターを持つことが保証されていない*場合、問題は解決しにくいです。 – phoog

+0

ArStr []は文字列配列には1文字の8要素が含まれ、配列には文字列に変換するときにnull、つまり ""が含まれます。sはnullであるためエラーが発生しました。エラー引数1: '文字列[]'から 'System.Collections.Generic.IEnumerable 'に変換できません – oreing

1

あなたはおそらく気づいてきたように、その文字列が "A" を含んでいるので、あなたがを書いたクエリは、リターン "aabbccd" を行い、それが "b" を含んでいます、それは "c"を含んでいます。

ArStrは唯一の文字の文字列を含めることができると仮定すると、あなたは(アニの答えから適応)言う必要がありますので、 のみ指定された文字を含む文字列を返すようにしたい

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

しかし、 ArStr要素が複数の文字になる可能性がある場合、問題をより明確に定義する必要があり、ソリューションがより複雑になります。

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

ArStr []は文字列です。配列には1文字の8要素が含まれています。配列がcharsになり、sがnullであるためにエラーが発生した – oreing

+0

まず最初に、 'null'は空の文字列(' '' ')と同じではありません。第二に、あなたはなぜあなたの配列にその文字列を持っていますか? '' ''が '' aabbccd''の部分文字列であるかどうかを調べることはどういう意味ですか?質問の枠組みに応じて、答えはすべての文字列(「はい」または「いいえ」)で同じでなければなりません。 – phoog

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

このメソッドを使用し、それはあなたの条件に合格するかどう単語を評価する:あなたはこの試みることができる

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; 
関連する問題