2012-02-19 3 views
3

Я пытаюсь получить отдельный список символов (с учетом регистра) по всем строкам в списке.Отдельные символы для нескольких строк

У меня есть список, содержащий 3 строки:

"AABbDDCCRRFF" 
"JOJaCK" 
"BILLY" 

Выход должен быть как (порядок символов не имеет значения):

ABDCRFJOKaILYb 

Я знаю, что ниже неправильно, но может» t work it out:

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

Кто-нибудь знает, как вернуть отдельные символы из каждой строки. Если это невозможно сделать в LINQ, тогда я открыт для альтернатив. Спасибо!

Обновление: Вау, отличные ответы, так быстро! Каким будет подход к получению символов в алфавитном порядке или по частоте появления?

ответ

1

В вашем кода, вы сначала выбираете отдельные символы от в пределах каждой строки, затем выбираете отдельные строки символов и, наконец, вызываете ToString на IEnumerable<T>.

Я хотел бы предложить, что вы сначала выбрать все символы из всех строк, примените 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

@ Дуглас: Да, возможно, это будет немного более эффективно, потому что это позволяет избежать создания отбрасываемого массива. Даже если я сомневаюсь, можно заметить разницу :) – digEmAll

1

Вы хотите иметь четкие символы, а не строки.

var strings = new string[] { "AABbDDCCRRFF", "JOJaCK", "BILLY" }; 
var q = (from str in strings 
     from c in str 
     select c).Distinct().ToList(); 
Смежные вопросы