2017-07-06 7 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 

誰もがいくつかの助けを私に提供することはできますか?なぜ2番目のケースでエラーが発生するのですか?

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、私はあなたの助けに感謝し、このソリューションをお試しいただきありがとうございます!私が使用したモジュールについて言及してくれなかったことを申し訳ありません。私はclrとSystemをインポートした.NETタイプにアクセスするために、System.Core.dllへの参照を追加しました。リストにアクセスするには、System.Cllections.Generic名前空間を使用しました。 Enumerable拡張を使用するために、私はSystem.Linq名前空間から拡張をインポートしました。これの擬似コードは次のようになります。import clr、import System、clr.AddReference( 'System.Core')、clr.ImportExtensions(System.Linq)、System.Collections.Generic import *、from System.Linq import * – Bill