Как исправить мои выражения LINQ с помощью Distinct()?C#

Место общения программистов C#
Ответить
Anonymous
 Как исправить мои выражения LINQ с помощью Distinct()?

Сообщение Anonymous »

Что-то не так с моим кодом, но я не могу понять, что это может быть!
Я работаю над консольным приложением C#, которое считывает данные из CSV-файла в пользовательский список объектов и обрабатывает их с помощью LINQ. По большей части приложение компилируется отлично, за исключением двух конкретных строк, где я пытаюсь извлечь уникальные значения и записать их в текстовые файлы. В частности, IDE выдает красную ошибку времени компиляции, указывающую на конец моей цепочки LINQ, где я пытаюсь использовать Distinct() и ForEach().
Интересно, что очень похожий запрос работает совершенно нормально ранее в коде, когда я использую számlák.Select(x => x.PályázatKód).Distinct().Count(). Однако, как только я пытаюсь перебрать отдельные значения, чтобы записать их в файл с помощью StreamWriter, компилятор отклоняет это. Кажется, ошибка возникает прямо во время перехода Distinct().ForEach(...), но я не могу точно определить, какое именно несоответствие типов или отсутствующая ссылка вызывает ее.
Для контекста мой класс Szamla правильно определен со стандартными автоматически реализуемыми свойствами и рабочим конструктором. Данные правильно считываются из файла szamlak.csv, а такие операции, как Count() и Sum(), выполняются без каких-либо проблем. Я уже убедился, что пространство имен System.Linq включено в начало моих файлов. Что мне не хватает в том, как Distinct() передает данные по цепочке, которая предотвращает выполнение ForEach? Как мне правильно перебрать эти отфильтрованные результаты и записать их в выходные файлы?
Класс:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace VizsgaKonzol
{
internal class Szamla
{
private string pályázatKód;
private string számlaszám;
private string dátum;
private int érték;
private string költségTípus;

public string PályázatKód { get => pályázatKód; set => pályázatKód = value; }
public string Számlaszám { get => számlaszám; set => számlaszám = value; }
public string Dátum { get => dátum; set => dátum = value; }
public int Érték { get => érték; set => érték = value; }
public string KöltségTípus { get => költségTípus; set => költségTípus = value; }

public Szamla(string pályázatKód, string számlaszám, string dátum, int érték, string költségTípus)
{
this.pályázatKód = pályázatKód;
this.számlaszám = számlaszám;
this.dátum = dátum;
this.érték = érték;
this.költségTípus = költségTípus;
}

public override string ToString()
{
return $"{pályázatKód}: {dátum} - {érték} Ft - {számlaszám} - {költségTípus}";
}

}
}

Program.cs:
using System.Threading.Channels;
using VizsgaKonzol;

List számlák = new List();

using (StreamReader reader = new StreamReader("szamlak.csv"))
{
reader.ReadLine();
while (!reader.EndOfStream)
{
string[] line = reader.ReadLine().Split(';');
számlák.Add(new Szamla(line[0], line[1], line[2], int.Parse(line[3]), line[4]));
}
}

var a = számlák.OrderBy(x => x.PályázatKód);

Console.WriteLine("3. feladat:\n\tA fájl beolvasása és eltárolása kész.");
Console.WriteLine($"4. feladat:\n\tA fájlban lévő számlák darabszáma: {számlák.Count}.");
Console.WriteLine($"5. feladat:\n\tA számlák összértéke: {számlák.Sum(x => x.Érték).ToString("##,#")} Ft.");
Console.WriteLine($"6. feladat:\n\t{számlák.Select(x => x.PályázatKód).Distinct().Count()} db különböző pályázat készült.");

using (StreamWriter sw = new StreamWriter("kodok.txt"))
{
számlák.OrderBy(x => x.PályázatKód).Select(x => x.PályázatKód).Distinct().ForEach(x => sw.Write($"{x}\n"));
}

Console.WriteLine("3. feladat:\n\tA kodok.txt fájl kész.");

using (StreamWriter sw = new StreamWriter("koltseg_tipusok.txt"))
{
számlák.OrderBy(x => x.KöltségTípus).Select(x => x.KöltségTípus).Distinct().ForEach(x => sw.Write($"{x}\n"));
}

Console.WriteLine("3. feladat:\n\tA koltseg_tipusok.txt fájl kész.");

Console.Write("9. feladat:\n\tAdja meg a keresett pályázat sorszámát: ");
string beker = Console.ReadLine();
if (beker.Length > 3)
{
Console.WriteLine("nem megfelelő számformátum, max 3 jegyű lehet!");
}
else
{
string nulla = "";
for (int i = 0; i < 3-beker.Length; i++)
{
nulla += "0";
}
nulla += beker;
beker = nulla;
}
List szűrt = számlák.Where(x => x.PályázatKód == $"P-{beker}").OrderBy(x => x.Dátum).ToList();
if (szűrt.Count > 0)
{
szűrt.ForEach(x => Console.WriteLine($"\t{x.ToString()}"));
Console.WriteLine($"\tÖsszesen {szűrt.Count} db számla tartozik hozzá.");
}
else { Console.WriteLine($"\tNincs ilyen pályázat: P-{beker}!"); }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»