2 回答

TA貢獻2016條經驗 獲得超9個贊
我不是 CSV 導出方面的專家,有一個您在 GetCSVResult 中嘗試過的示例會很棒。但是,我的猜測是:
以防萬一誤解了您的問題,您是否查看過這些鏈接? 將對象列表轉換為 csv 的最快方法,每個對象值都在新行中 ,并將 通用列表轉換為 CSV 字符串
現在,如果我理解得很好,用戶可以決定要導出或不導出哪一列,并在需要時更改其名稱。所以你可以有一個對象來描述這樣一個列。例如:
public class ColumnCSV
{
public int OriginalColumnIndex{ get; set; }
public string Name { get; set; }
public bool ExpectedInCSV { get; set; }
}
然后,您根據用戶輸入存儲這些列的列表,您可以輕松編寫一個可愛的開關來處理基于列索引的導出。

TA貢獻1828條經驗 獲得超6個贊
如果你不喜歡 switch 語句并且你有一些靜態類型的鍵,你可能想要使用這樣的東西:
static readonly string _divider = ",";
static readonly Dictionary<string, (string header, Func<Employee, string[]> employee)> _configurations
= new Dictionary<string, (string, Func<Employee, string[]>)>() {
["code1"] = ("FirstName,LastName,SSN,AppStartDate,AppDOB",
employee => new string[] {
employee.FirstName,
employee.LastName,
employee.SSN,
employee.StartDate,
employee.DOB }),
["code2"] = ("EMP_FIRST_NAME,EMP_LAST_NAME,EMP_SSN,EMP_DOB,EMP_JOB_START_DATE,PREV_EMPLOYED_BY_EMPLOYER",
employee => new string[] {
employee.FirstName,
employee.LastName,
employee.SSN,
employee.DOB,
employee.StartDate,
employee.PreviousEmployee ? "Y" : "N" })
//...
};
private string GetCSVResult( string code, List<Employee> employees )
=> _configurations[code].header
+ Environment.NewLine
+ employees.Select( e => _configurations[code]
.employee( e )
.Join( _divider ) )
.Join( Environment.NewLine );
我在這里使用這個自定義擴展:
public static class Extensions {
public static string Join<T>( this IEnumerable<T> array, string divider = "," ) => string.Join( divider, array );
}
還要注意靜態只讀字典。您可能想改用 Concurrent 或使用某種鎖定機制來復制然后執行(不確定所有這些,tbh)。并且它可能被包裝到某種類中以獲得更清晰的視圖(用法有點干凈,當我們談論C SV 時,您可能想擺脫 _divider)。
它不是最佳的(無論是在內存上還是在 cpu 上),對于相同的結果和所有這些東西都沒有緩存(而且我很確定 string[] 結果不是連接的最佳方法,無論連接是否可以字符串;另請注意, string.Join 的通用版本并不是最優的)。這完全取決于你,我希望你能理解字典。
另一種方法是使用反射。這樣做并不是那么快和好。帶有精神分裂癥氣味的OOD殺戮魔法。是的,您可以分配屬性,然后以某種方式執行它,但無論如何它都很丑陋(每個配置都有幾個屬性或很多參數)。
還有其他幾種方法可以“編譯”這個函數,使用純 IL 或委托作為簽名 + System.Linq.Expressions(它也涉及反射,但僅在第一次使用時)。
如果你想要一些真正干凈的解決方案,你應該考慮使用注入實現和自定義腳本語言進行結構描述的抽象轉換工廠,而不是硬編碼。但為什么?此代碼將返回有點正確的 CSV。希望它會有所幫助。
- 2 回答
- 0 關注
- 301 瀏覽
添加回答
舉報