С# Сортировка строкового массива в алфавитном порядке с учетом размещения строк, начинающихся с заглавной буквы. первый

1) Существует Kata, в котором говорится, что нужно упорядочить все строки в массиве строк, затем взять первое слово и добавить *** между каждой буквой: https://www.codewars.com/kata/sort-и-звезда

2) Например:

(1) Дано:

bitcoin
take
over
the
world
maybe
who
knows
perhaps

(2) После заказа:

bitcoin
knows
maybe
over
perhaps
take
the
who
world

(3) Возвращаемый результат:

b***i***t***c***o***i***n

3) Однако трудность, с которой я сталкиваюсь, заключается в следующем: как мы можем выразить «упорядочить сначала слова, начинающиеся с заглавной буквы»?

4) Я пробовал следующий код:

using System;
public class Kata
{
  public static string TwoSort(string[] s)
  {
  foreach(string str in s){
    Console.WriteLine(str);
  }
  Console.WriteLine("");
  Array.Sort(s);
  foreach(string str in s){
    Console.WriteLine(str);
  }

  Console.WriteLine("");

  string firstWord = s[0];
  string result = "";


  foreach(char letter in firstWord){
    result += letter + "***";

  }
  Console.WriteLine(result.Substring(0, result.Length - 3));
    return result.Substring(0, result.Length - 3);
  }  
}

5) Например:

(1) Дан следующий массив:

Lets
all
go
on
holiday
somewhere
very
cold

(2) После заказа:

all
cold
go
holiday
Lets
on
somewhere
very

(3) Текущий неверный результат:

a***l***l

(4) Ожидаемый правильный результат:

L***e***t***s

Я также прочитал:

как отсортировать массив строк по алфавиту?

Сортировка массива в алфавитном порядке в C#


person Enoy    schedule 13.07.2018    source источник


Ответы (2)


Вы должны указать компаратор, например. (решение Linq):

  string[] source = new string[] {
    "Lets",
    "all",
    "go",
    "on",
    "holiday",
    "somewhere",
    "very",
    "cold",
  };

  // StringComparer.Ordinal: order by Ascii values; capital letters < small letters 
  var ordered = source
    .OrderBy(item => item, StringComparer.Ordinal);

  Console.Write(string.Join(", ", ordered));

Исход:

  Lets, all, cold, go, holiday, on, somewhere, very

Для получения желаемого результата (в случае, если вы настаиваете на заказе) вы можете поставить

  var result = string.Join("***", source
    .OrderBy(item => item, StringComparer.Ordinal) 
    .First()
    .Select(c => c)); // <- turn string into IEnumerable<char> 

  Console.Write(result);

Исход:

  L***e***t***s

Если вы хотите продолжать использовать свой текущий код, измените Array.Sort(s); на

  Array.Sort(s, StringComparer.Ordinal);
person Dmitry Bychenko    schedule 13.07.2018

Вы можете указать компаратор порядковых строк, чтобы сократить результат заглавной, а затем строчной буквой.

Array.Sort(s, StringComparer.Ordinal);
person Gopalakrishnan    schedule 13.07.2018