mashka_1308
@mashka_1308

Как переписать в linq?

var wordOccurrences = new Dictionary<string, int>();
            foreach (var word in filteredWords)
                wordOccurrences[word.ToLower()] = wordOccurrences.ContainsKey(word.ToLower())
                    ? wordOccurrences[word.ToLower()] + 1
                    : 1;
            return wordOccurrences;


Имеется такой вот код, преподаватель сказал переписать в linq чтобы упростить код.
У меня получается наоборот только усложнить.
Пробовала через select, ничего другого в голову не приходит
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 2
mashka_1308
@mashka_1308 Автор вопроса
return filteredWords.
                GroupBy(w=>w).
                ToDictionary(g => g.Key, g => g.Count());


решение
Ответ написан
@hermer29
Перепишу сюда так чтобы из глаз не текла кровь:
var wordOccurrences = new Dictionary<string, int>();
foreach (var word in filteredWords.Select(x => x.ToLower())
{
    if(wordOccurrences.ContainsKey(word))
    {
        wordOccurrences[word] = wordOccurrences[word] + 1;
        continue;
    }
    wordOccurrences[word] = 1;
}
return wordOccurrences;

Максимум ток Select. Предполагая что filteredWords это список или массив string. По определению задачи: если в фильтрованном списке со словами есть слово которое есть в словаре, мы увеличиваем значение по ключу на единицу (по умолчанию 0). Если слово не встречается в словаре, то устанавливаем в счётчик 1. Очевидно, что задача не решение проблемы, это просто задача по приколу. По моему, лучше всего читается то что я выше написал, linq тут реально только усложнит, использование метода ForEach читается хуже чем цикл foreach в ситуации условной логики. Чтобы не вступать с преподом в конфликт можно сунуть ему вот это:
var wordOccurrences = new Dictionary<string, int>();
var filteredLower = filteredWords.Select(x => x.ToLower());
// Преполагаем что не встречающиеся слова в словаре имеют значение 1
// На этом этапе предположим что все слова - не встречающиеся
foreach (var word in wordOccurrences.Keys)
{
    wordOccurrences[word] = 1;
}

foreach (var word in filteredLower.Where(x => wordOccurrences.ContainsKey(x)))
{
    // Те слова, что всё таки встречаются мы начинаем инкрементить
    // Однако счёт не начинается с единицы по определению задачи, поэтому пропускаем первое увеличение
    if(wordOccurrences[word] == 1)
        continue;
    wordOccurrences[word]++;
}
return wordOccurrences;
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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