powinien być w stanie wykonać następujące czynności:
public List<string> Index(IFormFile file)
{
var result = string.Empty;
using (var reader = new StreamReader(file.OpenReadStream()))
{
result = reader.ReadToEnd();
}
return string.IsNullOrEmpty(result)
? null
: result.Split('\n').ToList();
}
Abstrakcja dla IFormFile
ma metodę .OpenReadStream
.
Aktualizacja
Aby zapobiec mnóstwo alokacji niepożądanych i potencjalnie dużych, powinniśmy przeczytać jeden wiersz na raz i budować naszą listę z każdej linii w ten sposób. Dodatkowo możemy zamknąć tę logikę w metodzie rozszerzenia. Akcja Index
kończy się wyglądać jak ten:
public List<string> Index(IFormFile file) => file.ReadAsList();
Odpowiednia metoda rozszerzenie wygląda następująco:
public static List<string> ReadAsList(this IFormFile file)
{
var result = new List<string>();
using (var reader = new StreamReader(file.OpenReadStream()))
{
while (reader.Peek() >= 0)
result.Add(reader.ReadLine());
}
return result;
}
Podobnie można mieć async
wersji, a także:
public static async Task<List<string>> ReadAsListAsync(this IFormFile file)
{
var result = new List<string>();
using (var reader = new StreamReader(file.OpenReadStream()))
{
while (reader.Peek() >= 0)
result.Add(await reader.ReadLineAsync());
}
return result;
}
wtedy może użyć tej wersji w ten sposób:
public Task<List<string>> Index(IFormFile file) => file.ReadAsListAsync();
to działało, chociaż nie akceptowałoby środowiska Environment.NewLine, więc użyłem 'Split ('\ n')', coś o chęci znaku zamiast łańcucha znaków – BigOmega
Dlaczego chcesz przeczytać to wszystko w jeden ciąg znaków, a następnie Podziel zrobić listę? Dlaczego nie po prostu przeczytać go wiersz po linii i dodać do listy? Powyższy kod przydziela potencjalnie gigantyczny ciąg znaków, aby następnie przydzielić tablicę, a następnie przydziela listę. – davidfowl
Wielka obserwacja. Po prostu pokazywałem, jak można to zrobić, zaktualizuję kod - dzięki. –