@Jut_Rut

Как работает Linq в данном примере и как научиться понимать комплексные записи Linq?

public static bool Scramble(string str1, string str2) 
    {
        return str2.All(x=>str1.Count(y=>y==x)>=str2.Count(y=>y==x));
    }

На простых примерах всё понятно, но в таких случаях сильно путаюсь. Как понимать такое и, дополнительный вопрос: А не противоречит ли такая запись самой идее чистого кода?
  • Вопрос задан
  • 70 просмотров
Решения вопроса 1
vabka
@vabka Куратор тега C#
Токсичный шарпист
А не противоречит ли такая запись самой идее чистого кода?

Противоречит. Это действительно очень сложно читать.
Но давай пошагово разберём:
1. str2.All Все символы из str2 удовлетворяют условию str1.Count(y=>y==x)>=str2.Count(y=>y==x)
2. str1.Count(y=>y==x) >= - в str1 количество искомых символов больше либо равно
3. str2.Count(y=>y==x) - количеству искомых символов в str2

Тоесть этот код проверяет, что в str1 каждый символ продублирован больше раз, чем в str2.

Кроме достаточно сложного выражения, тут пониманию мешают ещё и названия переменных, которые совершенно не отражают в себе то, что они содержат.

Я бы этот код переписал так:
// Эта функция считает, сколько раз каждый символ повторяется в строке
static Dictionary<char, int> CountChars(IEnumerable<char> str) =>
  str
  .GroupBy(x => x)
  .ToDictionary(x => x.Key, x => x.Count());

var str1CharCount = CountChars(str1);
var str2CharCount = CountChars(str2);

// Истинно, когда каждый символ из второй строки повторяется меньше или столько-же раз, как и в первой.
return str2CharCount.All(x => x.Value <= str1CharCount[x.Key]);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы