2012-02-19 7 views
3

목록의 모든 문자열에서 고유 한 문자 목록 (대소 문자 구분)을 얻으려고합니다.여러 문자열에서 고유 한 문자

내가 3 문자열을 포함하는 목록이 있습니다 출력은 같아야합니다

"AABbDDCCRRFF" 
"JOJaCK" 
"BILLY" 

를 (문자의 순서는 중요하지 않다) :

ABDCRFJOKaILYb 

나는 아래이 잘못 알고 있지만 수 있습니다 ' 해결 :

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

누구나 각 문자열에서 고유 문자를 반환하는 방법을 알고 계십니까? LINQ에서이 작업을 수행 할 수없는 경우 대체 방법을 사용할 수 있습니다. 감사합니다.

업데이트 : 와우, 훌륭한 답변, 너무 빨리! 문자를 사전 순으로 또는 발생 빈도별로 정렬하려면 어떻게해야합니까?

답변

1

코드를 사용하려면 먼저 의 각 문자를 개의 문자로 선택한 다음 개의 시퀀스 인을 선택하고 IEnumerable<T>에서 ToString을 호출해야합니다. 당신이 원하는

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()); 

편집 : @Douglas에 의해 제안

, 그것은, 즉 대신 new string()string.Concat()를 사용하여 좀 더 효율적으로 될 수있다 :

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

+1. 그러나'string.Concat (sequence)'는 배열 초기화를 피하기 때문에'new string (sequence.ToArray()) '보다 더 효율적이라고 가정합니다. – Douglas

+0

@Douglas : 네, 아마 멀리 던져 배열의 생성을 피하기 때문에 그것은 약간 더 효율적일 것입니다. 비록 내가 하나의 차이를 확인할 수 있습니다 의심 :) – digEmAll

1

:

난 당신이 먼저 모든 행에서 모든 문자를 선택 결합 된 순서에 Distinct 필터를 적용하고, 마지막 문자의 결과 순서를 연결하는 string.Concat를 호출 할 것을 제안 문자열이 아닌 고유 한 문자를가집니다.

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