我有一个关于IronPython中使用方法的问题。假设我有一些集合,然后从该集合创建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

这个代码工作正常。但是当我使用包含索引的Select方法时,我会得到错误:“int”对象是不可iterable的。python - IronPython中的LINQ-LMLPHP
我的代码如下:
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

有人能帮我吗?为什么在第二种情况下会有错误?
注意:对于接口使用,我在这里查看了:Interface In IronPython.对于匿名类型使用,我在这里查看了:Anonymous objects in Python.

最佳答案

我无法复制您的直接示例,我很好奇您用于创建列表和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”对象不可iterable。
因为lambda有两个参数,所以我们只需枚举listInt就可以给lambda一个合适的元组:
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

关于python - IronPython中的LINQ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44950757/

10-16 22:21