Вероятно, было бы проще использовать регулярное выражение и .replace
: захватить два символа в отдельных группах захвата, добавить первый символ в строку и заменить вторым символом. Затем у вас будет первая половина нужного вам вывода в одной строке, а вторая в другой: просто объедините их вместе и верните:
function encrypt(text) {
let removedText = '';
const replacedText1 = text.replace(/(.)(.)?/g, (_, firstChar, secondChar) => {
// in case the match was at the end of the string,
// and the string has an odd number of characters:
if (!secondChar) secondChar = '';
// remove the firstChar from the string, while adding it to removedText:
removedText += firstChar;
return secondChar;
});
return replacedText1 + removedText;
}
console.log(encrypt('This is a test!'));
Можно использовать пункт группы в C#, чтобы сделать это.
List<string> stuff = new List<string>();
...
var groups = from s in stuff group s by s into g select
new { Stuff = g.Key, Count = g.Count() };
Можно назвать дополнительные методы непосредственно также, если Вы хотите:
var groups = stuff.GroupBy(s => s).Select(
s => new { Stuff = s.Key, Count = s.Count() });
Отсюда это - короткий транзитный участок для размещения его в a Dictionary<string, int>
:
var dictionary = groups.ToDictionary(g => g.Stuff, g => g.Count);
Я составил бы специализированный Список, поддержанный Словарем и добавить методом протестирует на членство и увеличит количество, если найдено.
вид подобных:
public class CountingList
{
Dictionary<string, int> countingList = new Dictionary<string, int>();
void Add( string s )
{
if( countingList.ContainsKey( s ))
countingList[ s ] ++;
else
countingList.Add( s, 1 );
}
}
Ну, нет действительно никакого лучшего способа сделать это.
Возможно, Вы могли записать запрос LINQ, который сгруппирует строки и затем рассчитает, сколько строк там находится в каждой группе, но это не было бы почти столь же эффективно как что Вы уже имеете.
Одна идея состояла бы в том, чтобы дать словарю значение по умолчанию нуля, таким образом, у Вас не будет к особому случаю первого вхождения.