2016-05-17 43 views
0

我想initalize對象序列化,類對象是使用XSD.EXE創建。單個屬性可以沒有問題地初始化而是試圖初始化一個「無界」 XSD屬性時,我不能使用foreach循環去在每個值在數組中,並添加到對象:無效表達術語「的foreach」

 object[] test = new object[0]; 

     test[0] = "ring"; 

     export export = new export(); 

     export.info = new exportInfo 
     { 
      dateandtimeofexport = DateTime.Now, 
      duration = "10", 
      planningsoftware = new exportInfoPlanningsoftware 
      { 
       name = "", 
       major = "", 
       minor = "", 
       revision = "", 
       build = "" 
      }, 
      exporter = new exportInfoExporter 
      { 
       version = new exportInfoExporterVersion 
       { 
        name = "", 
        major = "", 
        minor = "", 
        revision = "", 
        build = "" 
       }, 
       module = new exportInfoExporterModule[] 
       { 
        foreach(Object x in test) 
        { 
        new exportInfoExporterModule{name = x.name, major = x.major, minor = x.minor, revision = x.revision, build = x.build;} 
        } 
       } 
      } 
     }; 

我認爲這裏的主要問題是我的確切瞭解如何初始化使用XSD.exe從我的XSD創建的對象類下的對象數組,任何人都可以建議如何在沒有foreach循環的情況下完成此操作嗎?

任何指導,非常感謝。

回答

-1

爲了能夠使用,你必須遍歷實現IEnumerable接口的容器上一個foreach。

這不是簡單數組的情況。只要在列表(列表實現IEnumerable)中轉換測試,它應該工作。

List<object> test = new List<object>(); 
+0

或再短一點'foreach(Test.ToList()中的Object x)' –

+2

簡單數組當然可以用'foreach'迭代。令人驚歎的是,這個答案得到了兩個贊同,不是很好。 OP的問題是'foreach'不允許在數組初始化器中''new exportInfoExporterModule [] {...}',而不是'foreach'不支持數組。 – GSerg

+0

感謝大家,但是這裏的問題是foreach無法在上下文中顯示。似乎只有基礎類結構(由xsd.exe創建)才能使用,並且在此對象初始化中不可能執行任何操作。 –

1

您的代碼的前兩行將導致運行時異常,因爲您試圖將值放入零長度數組中。

object[] test = new object[0]; 
test[0] = "ring"; 

運行時異常(線-1):索引陣列的邊界之外。

這裏是一個.NET Fiddle來表明。

通過foreach遍歷數組是完全正常!但問題是,循環是在一個對象初始值設定項中。這是不允許的,相反使用Linq.Select.ToArray()

module = test.Select(t => new exportInfoExporterModule { name = t }) 
      .ToArray(); 
3
module = test.Select(t => new exportInfoExporterModule{name = t}).ToArray() 

代替

module = new exportInfoExporterModule[] 
      { 
       foreach(Object x in test) 
       { 
       new exportInfoExporterModule{name = x} 
       } 
      } 

應該做的伎倆。瞭解一些LINQ它會得到清除這裏發生了什麼事;)

5

您的代碼是無效的C#。數組初始值設定項內不能使用foreach

// NOT VALID C# CODE! 
module = new exportInfoExporterModule[] 
{ 
    foreach(Object x in test) 
    { 
     new exportInfoExporterModule{name = x} 
    } 
} 

這是不可能的,因爲foreach語句,但陣列初始化器期望一個表達,結果在一個exportInfoExportedModule

你可以做什麼,而不是是這樣的:

module = test.Select(x => new exportInfoExporterModule{name = x}).ToArray() 

但要注意,在你的代碼開始創建數組test長度爲0,然後嘗試設置"ring"爲其第一(的)元素!這給了IndexOutOfRangeException。初始化test那樣:

object[] test = new object[] {"ring"}; 
3

您不能在初始化程序中使用循環。

看看你能不能後初始化數組你構造的對象的其餘部分:

export.info = new exportInfo 
{ 
     // ... 
     version = new exportInfoExporterVersion 
     { 
      name = "", 
      major = "", 
      minor = "", 
      revision = "", 
      build = "" 
     } 
    } 
}; 

export.info.exporter.module = new exportInfoExporterModule[test.Length]; 

for (int i = 0; i < test.Length; i++) 
{ 
    export.info.exporter.module[i] = new exportInfoExporterModule 
    { 
     name = test[i].name, 
     major = test[i].major, 
     minor = test[i].minor, 
     build = test[i].build, 
     revision = test[i].revision 
    }; 
} 

或者,使用LINQ:

export.info = new exportInfo 
{ 
     // ... 
     version = new exportInfoExporterVersion 
     { 
      name = "", 
      major = "", 
      minor = "", 
      revision = "", 
      build = "" 
     }, 
     module = test.Select(x => new exportInfoExporterModule 
     { 
      name = x.name, 
      major = x.major, 
      minor = x.minor, 
      build = x.build, 
      revision = x.revision 
     }).ToArray() 
    } 
}; 
+0

感謝BoltClock,我對此很陌生,所以很磕磕絆絆。這看起來像解決方案,但在我之前閱讀LINQ進一步可以告訴我如何使用LINQ方法來創建一個新的exportInfoExporterModule其中exportInfoExporterModule不只是'名稱',但'名稱,版本,主要,次要'請嗎? –

+0

@Dan Hall:與創建新的exportInfoExporterVersion的方式相同,當然您需要將x更改爲您要序列化的實際值。你可能想編輯你的問題來包含被序列化的實際對象,所以我們有更多的具體數據可以使用。 – BoltClock

+0

謝謝,我稍微更新了我的問題中的代碼,以顯示我試圖嘗試的內容。我不明白的是LINQ示例x表示什麼?我想知道如何擴展這個例子來創建與其他屬性的exportInfoExporterModule對象。 –

0

你必須創建數組你想要在創建導出器對象之前進行分配。

另一種方式可能是使用Linq來分配模塊。像 module = test.Select(x => new exportInfoExporterModule{name = x}).ToArray() 應該工作。