我有一個物件“Compact”,它由一個 ID 和兩個陣列組成:
public class Compact
{
public int Id { get; set; }
public int[] Number { get; set; }
public double[] Value { get; set; }
public Compact(int id, int[] number, double[] value)
{
Id = id;
Number = number;
Value = value;
}
}
可以像這樣初始化 Compact 物件串列:
List<Compact> c = new List<Compact>
{
new Compact(1, new int[] { 1, 2, 3 }, new double[] { 0.05, 0.02, 0.03 }),
new Compact(2, new int[] { 1, 2, 3 }, new double[] { 0.07, 0.01, 0.04 }),
new Compact(3, new int[] { 1, 2, 3 }, new double[] { 0.02, 0.025, 0.05 })
};
我正在尋找一種優雅的方式將此物件展平為“展平”物件:
public class Flattened
{
public int Id { get; set; }
public int Number { get; set; }
public double Value { get; set; }
public Flattened(int id, int number, double value)
{
Id = id;
Number = number;
Value = value;
}
}
展平的結果將對應于:
List<Flattened> f = new List<Flattened>
{
new Flattened(1,1,0.05),
new Flattened(1,2,0.02),
new Flattened(1,3,0.03),
new Flattened(2,1,0.07),
new Flattened(2,2,0.01),
new Flattened(2,3,0.04),
new Flattened(3,1,0.02),
new Flattened(3,2,0.025),
new Flattened(3,3,0.05)
};
我可以使用回圈進行扁平化,但我想知道是否有更適合的方法在性能方面,如 Linq 操作或不同的集合型別?
uj5u.com熱心網友回復:
您可以簡單地運行for回圈。
List<Compact> ls = new List<Compact>
{
new Compact(1, new int[] { 1, 2, 3 }, new double[] { 0.05, 0.02, 0.03 }),
new Compact(2, new int[] { 1, 2, 3 }, new double[] { 0.07, 0.01, 0.04 }),
new Compact(3, new int[] { 1, 2, 3 }, new double[] { 0.02, 0.025, 0.05 })
};
List<Flattened> ls2 = new List<Flattened>();
foreach (Compact compact in ls)
{
for (var index = 0; index < compact.Number.Length; index )
{
ls2.Add(new Flattened(compact.Id, compact.Number[index], compact.Value[index]));
}
}
請注意,我假設兩個陣列將具有相同數量的專案。
uj5u.com熱心網友回復:
使用 LINQ,你可以做到
c.SelectMany(
x => x.Number.Zip(x.Value, (n, v) => new Flattened(x.Id, n, v))
).ToList()
SelectMany進行展平,Zip顧名思義,將Number和Value陣列“壓縮”在一起,并將函式(n, v) => new Flattened(x.Id, n, v)應用于每一對,Flattened從每一對創建一個物件。
uj5u.com熱心網友回復:
您可以為此使用 Linq,結合SelectMany和Zip應該可以解決問題
(n, v) => (n, v)創建一對Number和的元組Value
List<Compact> ls = new List<Compact>
{
new Compact(1, new int[] { 1, 2, 3 }, new double[] { 0.05, 0.02, 0.03 }),
new Compact(2, new int[] { 1, 2, 3 }, new double[] { 0.07, 0.01, 0.04 }),
new Compact(3, new int[] { 1, 2, 3 }, new double[] { 0.02, 0.025, 0.05 })
};
var flattened = ls
.SelectMany(
c => c.Number.Zip(c.Value, (n, v) => (n, v)),
(c, nv) => new Flattened(c.Id, nv.n, nv.v)
).ToList();
網路小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/374507.html
下一篇:從.NETCore2.2遷移到.NETCore3.1-LINQLEFTJOIN-在DefaultIfEmpty上呼叫Take()不會轉換為服務器端SQL
