我有一個string[]贊:
{"DNSD90OOP","234","TEST","","32324" "ASERT89UY","567","TEST2","","1256"
"MSEWQ89UY","507","TEST3","","1206"}
我希望結果如下:
{"DNSD90OOP","234","TEST","","32324"},
{"ASERT89UY","567","TEST2","","1256"},
{"MSEWQ89UY","507","TEST3","","1206"}
如何使用 LINQ 或僅使用 C# 在 C# 中執行此操作?
uj5u.com熱心網友回復:
更新:決議 CSV 檔案
看起來實際的問題是如何將 CSV 檔案決議為記錄。
一種粗略的方法是一次讀取一行檔案并拆分該行:
var lines=File.ReadLines(path);
foreach(var line in lines)
{
var parts=line.Split(",");
}
ReadLines回傳一個一次IEnumerable<string>回傳一行,而不是一次讀取和拆分整個檔案。
此代碼可以轉換為 LINQ 查詢,甚至可以用于構造記錄:
var records= File.ReadLines(path)
.Select(line=>line.Split(","))
.Select(b=>new SomeRecord(b[0],b[1],b[2],b[3],b[4]))
.ToArray();
此代碼不會修剪周圍的引號。為此,必須使用Trim('"'),例如b[0].Trim('"')。這不是最優雅的解決方案。
如果通過 API 將檔案作為單個字串檢索,則可以使用 StringReader 逐行讀取它,例如:
public static IEnumerable<string> ReadStringLines(string input)
{
using var reader=new StringReader(input);
while(true)
{
var line=reader.ReadLine();
if(line!=null)
{
yield return line;
}
else
{
break;
}
}
}
...
var records= MyUtils.ReadStringLines(input)
.Select(line=>line.Split(","))
.Select(b=>new SomeRecord(b[0],b[1],b[2],b[3],b[4]))
.ToArray();
另一種可能性是使用正則運算式來拆分和修剪,但更好的解決方案是使用像 CsvHelper 這樣的 CSV 決議庫,它可以處理 CSF 檔案中的所有怪癖,如參考欄位、欄位中的換行符甚至丟失欄位
原始答案
結果顯示以 5 項為一組對陣列元素進行批處理,而不是訪問每個第 n 個元素。使用.NET (Core) 6 及更高版本中的Chunk可以在 LINQ 中進行批處理。在舊版本中,您可以使用MoreLINQ的Batch。
在.NET 6 中,您可以使用:
var batches=elements.Chunk(5);
batches是一個IEnumerable<string[]>。您可以將它們轉換為陣列,ToArray也可以用于Select從批處理項構造物件,例如:
var records=elements.Chunk(5)
.Select(b=>new SomeRecord(b[0],b[1],b[2],b[3],b[4]))
.ToArray();
MoreLinq的Batch回傳一個IEnumerable<IEnumerable<T>>. 這避免了為每個批次分配一個新陣列。但是,如果您需要將專案作為陣列處理,則需要一個額外的ToArray().
var records=elements.Batch(5)
.Select(batch=>{
var b=batch.ToArray();
return new SomeRecord(b[0],b[1],b[2],b[3],b[4]);
})
.ToArray();
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/408618.html
標籤:
下一篇:Linq一對多與過濾器
