Вычитание значений List (c#)
Существует 2 List.
Первый лист имеет подобную структуру:
List<LetterFreq> letter = new List<LetterFreq>();
letter.Add(new LetterFreq() { letter = "A", freq = 0.082M });
letter.Add(new LetterFreq() { letter = "B", freq = 0.015M });
letter.Add(new LetterFreq() { letter = "C", freq = 0.028M });
letter.Add(new LetterFreq() { letter = "D", freq = 0.043M });
letter.Add(new LetterFreq() { letter = "E", freq = 0.127M });
(ниже Main прописан код для этого list)
public class LetterFreq
{
public string letter;
public decimal freq;
}
Второй лист имеет структуру:
List<NowFreq> nowLetter1 = new List<NowFreq>();
nowLetter1 .Add(new NowFreq() { nowLetter = "B", nowFreq = 0.002M});
nowLetter1 .Add(new NowFreq() { nowLetter = "E", nowFreq = 0.15M});
(ниже Main прописан код для этого list2)
public class NowFreq
{
public string nowLetter;
public decimal nowFreq;
}
Необходимо найти буквы из nowLetter (B, E) в letter и вычесть их частоты, после возвести в квадрат (буквы, пары для которой не найдено, считать просто, как частота из первого листа). Другими словами, нужно получить что-то подобное:
0,082 + (0,015 - 0,002)^2 + 0,028 + 0,043 + (0,127 - 0,15)^2
Ответы (1 шт):
Есть два замечания, почему не стоит решать вашу задачу в том виде, как она описана:
- Вам нужно многократно итерировать (цикл внутри цикла), List для поиска неоптимальная структура - сложность решения будет O(N^2), правильнее перейти к использованию структур данных на основе хеш-таблиц, тогда сложность будет O(N)
- У вас два класса имеют одинаковые поля, логичнее будет использовать один класс
Но если уж прям вот надо именно так, то вот прямо так как есть так и пишите:
var sum = 0M;
foreach (var element in freq)
{
var found = now.FirstOrDefault(x => x.nowLetter == element.letter);
if(found == null)
{
sum = sum + element.freq;
}
else
{
sum = sum + (element.freq - found.nowFreq) * (element.freq - found.nowFreq);
}
}
Я поменял названия переменных, потому что у вас в тексте задания ошибка, код не скомпилируется:
List<LetterFreq> freq = new List<LetterFreq>();
freq.Add(new LetterFreq() { letter = "A", freq = 0.082M });
freq.Add(new LetterFreq() { letter = "B", freq = 0.015M });
freq.Add(new LetterFreq() { letter = "C", freq = 0.028M });
freq.Add(new LetterFreq() { letter = "D", freq = 0.043M });
freq.Add(new LetterFreq() { letter = "E", freq = 0.127M });
List<NowFreq> now = new List<NowFreq>();
now.Add(new NowFreq() { nowLetter = "B", nowFreq = 0.002M });
now.Add(new NowFreq() { nowLetter = "E", nowFreq = 0.15M });
Ответ для тестового примера приведённого в задаче будет 0,153698