2015-09-15 16 views
1

我遍歷包含雙精度數組的對象。名稱已更改。想象一下,這是實驗室樣品的一個對象,我試圖獲得Sample對象的平面表示。動態的方法來平整類中的數組?

來源:

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

,例如:

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

如何finangle sample.RawReadings給我的陣列中的所有n項? 我不在乎它是否被命名。

編輯爲了清楚起見:我希望結果列表中的每個項目都具有名稱,並且在類中具有與RawReads類似的多個項目。我做而不是希望結果列表中的每個項目都有一個名稱和一個數組 - 這與我所擁有的相同。

樣品的LinQ:

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

這甚至可能嗎?

編輯: 我正在喂這對第三方API調用,期望在「行和列格式」的東西。 Aspose.Cells確切地說是ImportCustomObject。有可能通過多次調用解決它並手動對齊它們,但這可能會非常棘手並且易於出錯。

+1

你的問題不明確。你是否想要一個包含名稱和讀數的對象的結果列表,以便在樣本中達到原始讀數? –

+0

這是正確的,但原始讀數的結果列表不應該包含在列表中每個項目所包含的數組中。換句話說,該列表不應該包含名稱和列表,而是名稱和n雙打。 – Tan

+0

你想扁平化到'FlattenedSample {Name,Type,Reading}'嗎? –

回答

6

我希望結果列表中的每個項目都具有名稱,並且與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; 
} 
+0

謝謝。我可能已經實施了另一種解決方案,但如果甚至有可能的話,我很好奇。你的迴應對我而言是有意義的,並且是教育性的。如果有更多精彩的黑客被夢想起來,我會稍微留意一下。 :) – Tan

+0

sample.RawReadings.Count() –

+1

@ArghyaC:哎呀,以爲它是一個'List '。改爲「長度」。 –

4

假設你有一個像這樣的樣本數據(這裏我曾經代表RawReadings爲逗號分隔,但實際它們是雙陣列): -

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 
         }); 
+0

謝謝,我的確在尋找不可能的案例。只有一個foo和一個酒吧。 贊: foo bar 1.2 3.5 4.8; foo1 bar1 8.3 6.6 – Tan

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