2012-02-19 12 views
3

リスト内のすべての文字列の異なる文字(大文字と小文字が区別されます)を取得しようとしています。複数の文字列の異なる文字

私は3列含むリストがあります:

"AABbDDCCRRFF" 
"JOJaCK" 
"BILLY" 

出力は(文字の順序は重要ではありません)のようにする必要があります:

ABDCRFJOKaILYb 

私は以下の間違っている知っているが、することができます」をそれを解決する:

  distChars = (from string row in valuesList[c] 
         select row.Distinct() 
         ).Distinct().ToString(); 

誰もが各文字列の中から別の文字を返す方法を知っていますか?これをLINQで行うことができない場合は、私は代替案を公開しています。 ありがとう!

更新: すごい、すばらしい答え、とても速い!アルファベット順や出現頻度で文字を取得する方法は何でしょうか?

答えて

1

あなたの最初に別の文字をから以内に選択し、別のシーケンスの文字を選択し、最後にIEnumerable<T>ToStringを呼び出します。

私は、あなたが最初にすべてのあなたの行からすべて文字を選択することを示唆している組み合わせ配列にDistinctフィルタを適用し、最終的には文字の結果のシーケンスを連結するstring.Concatを呼び出します。

var distChars = string.Concat(
    (
     from row in valuesList[c] 
     from c in row 
     select c 
    ).Distinct()); 
0

ここでの問題は、コレクションのコレクションがあることです。別の文字を選択する前に文字列を結合してみてください。

1

これを試してください。

あなたはこの方法で行うことができます
var valuesList = new List<string> {"AABbDDCCRRFF", "JOJaCK", "BILLY"}; 

var distChars = string.Join("", (from str in valuesList // Select all strings. 
           from ch in str   // Select all chars. 
           select ch).Distinct()); // Get distinct chars. 
5

string[] values = new []{"AABbDDCCRRFF","JOJaCK","BILLY"}; 

var uniqueChars = new string(values.SelectMany(x => x).Distinct().ToArray()); 

EDIT:@Douglasにより示唆されるように

、それはstring.Concat()代わりのnew string()、すなわちを使用して、わずかに、より効率的かもしれない:

var uniqueChars = string.Concat(values.SelectMany(x => x).Distinct()); 
+1

+1。しかし、配列の初期化を避けるため、 'string.Concat(sequence)'が 'new string(sequence.ToArray())より効率的であると仮定します。 – Douglas

+0

@Douglas:はい、おそらく、スローアウェイ配列の作成を避けるため、やや効率的です。たとえ私が1つの違いに気づくことができると疑う場合でも:) – digEmAll

1

あなたが欲しいです文字列ではなく異なる文字を持つこと。

var strings = new string[] { "AABbDDCCRRFF", "JOJaCK", "BILLY" }; 
var q = (from str in strings 
     from c in str 
     select c).Distinct().ToList(); 
関連する問題