Задать вопрос
@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));
    }

На простых примерах всё понятно, но в таких случаях сильно путаюсь. Как понимать такое и, дополнительный вопрос: А не противоречит ли такая запись самой идее чистого кода?
  • Вопрос задан
  • 82 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Stepik
    Профессия "C# разработчик"
    1 неделя
    Далее
  • XYZ School
    C# для разработки игр
    5 месяцев
    Далее
  • OTUS
    C# Developer. Professional
    6 месяцев
    Далее
Решения вопроса 1
А не противоречит ли такая запись самой идее чистого кода?

Противоречит. Это действительно очень сложно читать.
Но давай пошагово разберём:
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]);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы