代码之家  ›  专栏  ›  技术社区  ›  tarn

可以在Ironpython中使用LINQ类型和扩展方法吗?

  •  34
  • tarn  · 技术社区  · 15 年前

    是否可以在Ironpython中使用LINQ类型和扩展方法?

    如果是这样怎么办?还有,经常有更多的蟒蛇做同样的事情吗?

    4 回复  |  直到 12 年前
        1
  •  40
  •   Steve Gilham    13 年前

    Ironpython 2.7最终与 clr.ImportExtensions 方法,将命名空间中的扩展方法添加到目标类型,例如

    >& 'C:\Program Files\IronPython 2.7\ipy.exe'
    IronPython 2.7 (2.7.0.40) on .NET 4.0.30319.225
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import clr
    >>> clr.AddReference("System.Core")
    >>> from System.Collections.Generic import List
    >>> dir (List)
    ['Add', 'AddRange', 'AsReadOnly', 'BinarySearch', 'Capacity', 'Clear', 'Contains', 'ConvertAll', 'CopyTo', 'Count', 'Enu
    merator', 'Equals', 'Exists', 'Find', 'FindAll', 'FindIndex', 'FindLast', 'FindLastIndex', 'ForEach', 'GetEnumerator', '
    GetHashCode', 'GetRange', 'GetType', 'IndexOf', 'Insert', 'InsertRange', 'IsReadOnly', 'IsSynchronized', 'Item', 'LastIn
    dexOf', 'MemberwiseClone', 'ReferenceEquals', 'Remove', 'RemoveAll', 'RemoveAt', 'RemoveRange', 'Reverse', 'Sort', 'Sync
    Root', 'ToArray', 'ToString', 'TrimExcess', 'TrueForAll', '__add__', '__class__', '__contains__', '__delattr__', '__doc_
    _', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__iter__', '__len__', '__new__', '__reduce
    __', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__']
    >>> import System
    >>> clr.ImportExtensions(System.Linq)
    >>> dir (List)
    ['Add', 'AddRange', 'Aggregate', 'All', 'Any', 'AsEnumerable', 'AsParallel', 'AsQueryable', 'AsReadOnly', 'Average', 'Bi
    narySearch', 'Capacity', 'Cast', 'Clear', 'Concat', 'Contains', 'ConvertAll', 'CopyTo', 'Count', 'DefaultIfEmpty', 'Dist
    inct', 'ElementAt', 'ElementAtOrDefault', 'Enumerator', 'Equals', 'Except', 'Exists', 'Find', 'FindAll', 'FindIndex', 'F
    indLast', 'FindLastIndex', 'First', 'FirstOrDefault', 'ForEach', 'GetEnumerator', 'GetHashCode', 'GetRange', 'GetType',
    'GroupBy', 'GroupJoin', 'IndexOf', 'Insert', 'InsertRange', 'Intersect', 'IsReadOnly', 'IsSynchronized', 'Item', 'Join',
     'Last', 'LastIndexOf', 'LastOrDefault', 'LongCount', 'Max', 'MemberwiseClone', 'Min', 'OfType', 'OrderBy', 'OrderByDesc
    ending', 'ReferenceEquals', 'Remove', 'RemoveAll', 'RemoveAt', 'RemoveRange', 'Reverse', 'Select', 'SelectMany', 'Sequen
    ceEqual', 'Single', 'SingleOrDefault', 'Skip', 'SkipWhile', 'Sort', 'Sum', 'SyncRoot', 'Take', 'TakeWhile', 'ToArray', '
    ToDictionary', 'ToList', 'ToLookup', 'ToString', 'TrimExcess', 'TrueForAll', 'Union', 'Where', 'Zip', '__add__', '__clas
    s__', '__contains__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__',
     '__iter__', '__len__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__'
    , '__str__', '__subclasshook__']
    >>>
    

    这使它符合IronRuby 1.1 using_clr_extensions 方法。

        2
  •  23
  •   Patrick    15 年前

    您可以通过列表理解来完成对Linq的一些操作:

    [myFunc(i) for i in numbers if i > 3]
    

    或者可以使用map、reduce和filter:

    map(myFunc, filter(lambda x: x > 3, numbers))
    

    但是列表理解比使用函数式编程结构更“蟒蛇式”。对于减少的事情,考虑使用 “”加入。 总和 . 您可以使用 任何 全部的

    记住这些翻译:

    Select -> map
    Where -> filter
    Aggregate -> reduce
    

    你在路上会好起来的!

        3
  •  11
  •   Simon Opelt    12 年前

    IronPython 2.7.1 你有 clr.importextensions 对于这个用例。

    import clr
    clr.AddReference("System.Core")
    import System
    clr.ImportExtensions(System.Linq)
    
    # will print 3 and 4 :)
    [2, 3, 4].Where(lambda x: x != 2).ToList().ForEach(System.Console.WriteLine)
    

    一点背景: IronPython 2.7 最初介绍了这个特性,但是 an issue 这就阻止了它的真正用途。

        4
  •  3
  •   jeroenh    14 年前

    described a C# wrapper class 围绕LINQ扩展方法,以实现类似于Ironpython中C“链式扩展方法”语法的语法。

    我们的想法是有一个装饰类 IEnumerable 只调用扩展方法。也许这个包装类也可以用Ironpython编写,但我对python还不太熟悉:-)

    public class ToLinq<T> : IEnumerable<T>
    {
        private readonly IEnumerable<T> _wrapped;
    
        public ToLinq(IEnumerable<T> wrapped)
        {
           _wrapped = wrapped;
        }
    
        public ToLinq<T> Where(Func<T, bool> predicate)
        {
            return new ToLinq<T>(_wrapped.Where(predicate));
        }
    
    
        // ... similar methods for other operators like Select, Count, Any, ...
    
    }
    

    这允许使用与此类似的语法:

    johns = ToLinq[Customer](customers)\
              .Where(lambda c: c.Name.StartsWith("John"))\
              .Select(lambda c: c.Name)
    

    免责声明:这是我作为一个学习练习尝试的东西,我没有在一个真实的项目中使用过。