我正在遍历包含双精度数组的对象。名称已更改。想象一下,这是Lab样本的一个对象,我试图得到Sample对象的平面表示。
自:
Sample
{
public string Name
public string Type
...
public double[] RawReadings
}
To,例如:
Name,
RawRead1,
RawRead2,
RawRead3,
...
RawReadn
如何整理sample.RawReadings以给我数组中的所有n项? 我不在乎它是否被命名。
为了清晰起见编辑:我希望结果列表中的每个项目都具有Name,并且与类中的属性一样多,因为有RawReads。我不希望结果列表中的每个项目都有一个名称和一个数组 - 这就像我所拥有的那样。
示例LinQ:
from sample in Samples
select new
{
Name = sample.Name,
sample.RawReadings
}
这甚至可能吗?
修改 我将此信息提供给第三方API调用,这些调用期望采用行和列格式"。 Aspose.Cells ImportCustomObject准确。有可能通过多次调用解决它并手动对齐它们,但这可能很棘手且容易出错。
答案 0 :(得分:6)
我希望结果列表中的每个项目都具有Name和RawReads的双倍数。
您无法使用匿名类型执行此操作。匿名类型具有在编译时指定的属性名称和类型,而您希望在执行时指定它们。我们不清楚你为什么要这样做,但你最接近的将是使用动态类型,你可以使用expando:
public dynamic SampleToDynamic(Sample sample)
{
IDictionary<string, object> expando = new ExpandoObject();
expando["Name"] = sample.Name;
for (int i = 0; i < sample.RawReadings.Length; i++)
{
expando["RawRead" + (i + 1)] = sample.RawReadings[i];
}
return expando;
}
答案 1 :(得分:4)
假设你有这样的样本数据(这里我将RawReadings表示为以逗号分隔,但实际上它们是double的数组): -
Name Type RawReadings
--------------------------------
foo bar 1.2, 3.5, 4.8
foo1 bar1 8.3, 6.6
据我所知,您需要将所有RawReadings值作为名称和放大器的新属性获取。类型。但正如@JonSkeet所解释的那样,这是不可能的。可能的做法是展平RawReadings
数据并将其与Sample
类的其他属性合并,如下所示: -
Name Type RawReadings
--------------------------------
foo bar 1.2
foo bar 3.5
foo bar 4.8
foo1 bar1 8.3
foo1 bar1 6.6
以下是此代码: -
var result = sampleData
.SelectMany(x => x.RawReadings, (sampleObj, rawObj) => new { sampleObj, rawObj })
.Select(x => new
{
Name = x.sampleObj.Name,
Type = x.sampleObj.Type,
raws = x.rawObj
});
答案 2 :(得分:0)
假设你有像
这样的数据var samples = new List<Sample>();
samples.Add(new Sample { Name = "A", Type = "TypeA", RawReadings = new double[] { 1.5, 2.5, 3.5 } });
samples.Add(new Sample { Name = "B", Type = "TypeB", RawReadings = new double[] { 1.6, 2.6, 3.6 } });
你想要像
这样的东西A 1.5
A 2.5
A 3.5
B 1.6
B 2.6
C 3.6
您可以使用此代码
var sampleReadings = new List<KeyValuePair<string, double>>();
samples.ForEach(s =>
s.RawReadings.ToList().ForEach(r =>
sampleReadings.Add(new KeyValuePair<string, double>(s.Name, r))));