2017-07-06 23 views
3

Ich habe eine Frage zur Verwendungsmethode in IronPython. Nehmen wir an, ich habe eine Sammlung und dann erstelle ich IronPython anonymen Typ aus dieser Sammlung und ich möchte über diese Sammlung iterieren. Mein Code sieht so aus:LINQ in IronPython

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 

Dieser Code funktioniert gut. Aber wenn ich die Select-Methode mit dem Index inkorporiere, bekomme ich einen Fehler: Das Objekt 'int' ist nicht iterierbar. Error

Mein Code sieht wie folgt aus:

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 

Kann mir jemand bieten mit etwas Hilfe? Warum gibt es einen Fehler im zweiten Fall?

PS: Für Schnittstelle Nutzung sah ich hier: Interface In IronPython. Für anonyme Typen Nutzung sah ich hier: Anonymous objects in Python.

Antwort

0

es Ihr direktes Beispiel nicht reproduzieren können, ich bin neugierig auf das Modul verwenden Sie die Listen zu erstellen und die IEnumerable (ich bin ein Makegenerictype auf nicht gattungsgemäße Problem konfrontiert), gelang es jedoch, ich Ihr Problem in Python zu reproduzieren:

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) 

Dies hat den gleichen Fehler wirft

'int' object is not iterable.

weil das Lambda 2 Parameter nimmt, so dass wir nur die listInt aufzählen müssen, um ein geeignetes Tupel das Lambda zu geben:

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) 

Ich hoffe, dass es Ihnen mit den Systemtypen helfen kann, ich bevorzuge Python :-p

+1

Hallo @PRMoureu, ich schätze Ihre Hilfe, werde diese Lösung versuchen, danke! Entschuldigung, dass ich Module, die ich benutzt habe, nicht erwähnt habe. Um auf .NET-Typen zugreifen zu können, habe ich gerade clr und System importiert, und dann habe ich einen Verweis auf System.Core.dll hinzugefügt. Um auf die Klasse zugreifen zu können, habe ich den System.Cllections.Generic-Namespace verwendet. Zur Verwendung von Enumerable Extensions habe ich Erweiterungen aus dem System.Linq-Namespace importiert. Pseudocode sieht dafür so aus: import clr, import System, clr.AddReference ('System.Core'), clr.ImportExtensions (System.Linq), aus System.Collections.Generic import *, aus System.Linq import * – Bill