在类中平面化数组的动态方法

本文关键字:动态 方法 数组 平面化 | 更新日期: 2023-09-27 18:12:46

我正在遍历包含双精度数组的对象。名字变了。假设这是一个Lab样本的对象,我正试图得到样本对象的平面表示。

来自:

Sample
{
    public string Name
    public string Type
    ...
    public double[] RawReadings
}

To,例如:

Name,
RawRead1,
RawRead2,
RawRead3,
...
RawReadn

我如何融资样本。rawreads给我数组中的所有n个项目?我不在乎有没有命名

为清晰编辑:我希望结果列表中的每个项目都具有Name和类中有RawReads的属性的尽可能多的double。我希望结果列表中的每个项都有一个Name和一个数组-这将与我所拥有的相同。

样本LinQ:

from sample in Samples
select new
{
    Name = sample.Name,
    sample.RawReadings
}

这可能吗?

编辑:

我将此提供给第三方API调用,该调用期望"行和列格式"的东西。Aspose。确切的说是Cells ImportCustomObject。也许可以通过多个调用来解决这个问题,并手动对齐它们,但这可能很棘手,而且容易出错。

在类中平面化数组的动态方法

我希望结果列表中的每个项目都具有Name和尽可能多的double。

使用匿名类型不能这样做。匿名类型具有在编译时指定的属性名和类型,而您希望在执行时指定它们。不清楚为什么要这样做,但最接近的方法是使用动态类型,为此可以使用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;
}

假设您有这样的示例数据(这里我将rawreads表示为逗号分隔,但实际上它们是双元数组):-

Name     Type      RawReadings
--------------------------------
foo      bar         1.2, 3.5, 4.8
foo1     bar1        8.3, 6.6

据我所知,你需要所有的rawreads值来获取新的属性名称&类型。但正如@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
                      });

假设您有如下数据:

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))));