2017-07-06 75 views
3

我有一個關於IronPython中的使用方法的問題。假設我有一些集合,然後從該集合創建IronPython匿名類型,並且我想遍歷該集合。我的代碼如下所示:IronPython中的LINQ

listInt = List[int]([0, 1, 2, 3, 4]) 
firstCollection = listInt.Select(lambda(v): type('SomeType', (object,),{"TypeValue": v*v, "TypeIndex": v})()) 
enumeratorFirst = IEnumerable[object].GetEnumerator(firstCollection) 
while enumeratorFirst.MoveNext(): 
    item = enumeratorFirst.Current 

此代碼正常工作。但是當我使用索引合併的Select方法時,我得到錯誤:'int'對象不可迭代。 Error

我的代碼如下所示:

listInt = List[int]([0, 1, 2, 3, 4]) 
secondCollection = listInt.Select(lambda(v, i): type('SomeType', (object,), {"TypeValue": v*v, "TypeIndex": i})()) 
enumeratorSecond = IEnumerable[object].GetEnumerator(secondCollection) 
while enumeratorSecond.MoveNext(): 
    item = enumeratorSecond.Current 

誰能爲我提供一些幫助?爲什麼第二種情況有錯誤?

PS:對於接口的使用我看了看這裏:Interface In IronPython.對於匿名類型的使用我看了看這裏:Anonymous objects in Python.

回答

0

我不能重現你直接的例子,我很好奇您使用的是創建列表的模塊和了IEnumerable(我面對非泛型類型問題上MakeGenericType),但是,我設法重現您的問題在Python:

listInt = [0,1,2,3,4] 
secondCollection = map(lambda(v, i): type('SomeType', (object,), 
        {"TypeValue": v*v, "TypeIndex": i})(), listInt) 
for item in secondCollection: 
    print(item) 

這引發了同樣的錯誤

'int' object is not iterable.

因爲拉姆達服用2個參數,所以我們只需要列舉listInt給予適當的元組的拉姆達:

listInt = [0,1,2,3,4] 
secondCollection = map(lambda(v, i): type('SomeType', (object,), 
        {"TypeValue": v*v, "TypeIndex": i})(), enumerate(listInt)) 
for item in secondCollection: 
    print(item.TypeIndex, item.TypeValue) 

>>> (0, 0) 
>>> (1, 1) 
>>> (2, 4) 
>>> (3, 9) 
>>> (4, 16) 

我希望它可以幫助你的系統類型,我喜歡的Python :-p

+1

嗨@PRMoureu,感謝您的幫助,將嘗試此解決方案,謝謝!對不起提及我使用的模塊。爲了能夠訪問.NET類型,我只導入了clr和System,然後添加了對System.Core.dll的引用。要訪問List 類,我使用了System.Cllections.Generic命名空間。爲了使用Enumerable擴展,我從System.Linq命名空間導入了擴展。此代碼的僞代碼如下所示:從System.Collections.Generic import *導入系統,clr.AddReference('System.Core'),clr.ImportExtensions(System.Linq),從System.Linq導入* – Bill