我正在制作一個基本的 CSV 閱讀器。header我使用and將標題與內容分開data。現在,我的串列包含 person 型別的資料:
public class person
{
public int id;
public string name;
public int age;
public person(string id, string name, string age)
{
try
{
this.id = Convert.ToInt32(id);
this.name = name;
this.age = Convert.ToInt32(age);
}
catch (FormatException e)
{
Console.WriteLine(e.Message);
}
}
public string ToString()
{
return $"{id}, {name}, {age}";
}
}
現在 id 喜歡采用型別data并制作一個person存盤資訊的型別。現在我正在嘗試使用IEnumerable<>所有內容,因為這里的許多評論都說它更適合記憶體管理。現在,由于它的行為有點不同,所以List<T>我在制作存盤人員的型別時遇到了問題。我左右使用都有錯誤,IEnumerable所以我懶得寫下我糟糕的代碼。
var data = file.Skip(1).Select(p => p.Split(';'));
IEnumerable<person> listofperson;
我的問題是,我怎樣才能使這項作業使用IEnumerable<>?還是我什至應該關心,寧愿去List<>?
uj5u.com熱心網友回復:
有IEnumerable.Append。如果您想在不制作完整副本的情況下將一個附加專案附加到一個大串列中,這非常有用,但在添加許多專案時不適合使用。
我可能會建議使用迭代器塊
public IEnumerable<Person> GetData(){
...
var lines = file.Skip(1);
foreach(var line in lines){
var cells = line.Split(';');
var person = new Person(...);
yield return person;
}
}
這是撰寫一個根據需要處理資料的惰性讀取器的簡單而緊湊的方法。但請注意,每次迭代 IEnumerable 時都會執行此決議。因此,在許多情況下,您要做的第一件事就是將其轉換為串列。
我會小心關于記憶體管理的宣告。如果您正在處理大檔案,那么像這樣的某種流式解決方案確實很關鍵,但您需要非常小心,這樣您就不需要將所有檔案都保存在記憶體中。但是,在處理小檔案時,一次完成所有處理可能會更有效。或者在兩者之間做一些事情,比如處理資料塊。這實際上取決于您的用例是什么以及記憶體和性能要求是什么。
uj5u.com熱心網友回復:
IEnumerable<T>只是一個介面,而不是一個實作。如果你看它的定義,它只支持“列舉”的能力。您正在尋找支持將型別添加到某種集合的能力的介面和基礎型別。如果您看一下,ICollection<T>您會發現它建立在IEnumerable<T>的列舉能力之上,增加了對管理集合內容的支持。用于此目的的典型型別是List<T>. 我會從那里開始,List<Person>用物件填充你。一旦你有了這個串列Person,你就可以使用介面List<T>實作來控制它的使用方式。例如,如果您只想為您的 提供列舉支持List<Person>,您可以將其轉換為IEnumerable<Person>,從而縮小焦點。
var myPeople = new List<Person>();
/// populate the list
myPeople.Add(new Person());
/// provide 'focussed' interface to underlying type
IEnumerable<Person> enumerablePeople = myPeople;
還有其他型別的實作ICollection<T>具有不同的專業性,但是,List<T>這可能是您需要的最簡單的起點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/476618.html
下一篇:tensorflow中pytorchmodule.register_parameter(name,param)的替代方法是什么?
