在C#中像LINQ Swift中的东西

我知道Swift还是比较新的,但是我想知道Swift在C#中是否有类似于LINQ的东西?

对于LINQ,我的意思是像标准查询运算符匿名types对象初始化程序等所有优秀的工具。

Swift整合了几个作为LINQ捆绑在一起的特性,尽pipe可能不是非常具有开箱即用的意义。

匿名types与Swift中具有命名值的元组非常接近。

在C#中:

var person = new { firstName = "John", lastName = "Smith" }; Console.WriteLine(person.lastName); 

输出: Smith

在Swift中:

 var person = (firstName: "John", lastName: "Smith") person.firstName = "Fred" print(person.lastName) 

输出: Smith

LINQ查询当然是非常强大/富有performance力的,但是你可以在Swift中使用mapfilterreduce来复制大部分的function。 lazy ,你可以得到相同的function,你可以创build一个可以提前循环的对象,只有在循环实际发生时才能评估它。

在C#中:

 var results = SomeCollection .Where(c => c.SomeProperty < 10) .Select(c => new {c.SomeProperty, c.OtherProperty}); foreach (var result in results) { Console.WriteLine(result.ToString()); } 

在Swift中:

 // just so you can try this out in a playground... let someCollection = [(someProperty: 8, otherProperty: "hello", thirdProperty: "foo")] let results = someCollection.lazy .filter { c in c.someProperty < 10 } // or instead of "c in", you can use $0: .map { ($0.someProperty, $0.otherProperty) } for result in results { print(result) } 

Swiftgenerics使写操作与现有的LINQfunction类似,非常简单。 例如,从LINQ维基百科的文章 :

计数 Count运算符计算给定集合中元素的数量。 重载谓词,计算匹配谓词的元素的数量。

可以这样写在Swift中(2.0协议扩展语法):

 extension SequenceType { // overload for count that takes a predicate func count(match: Generator.Element -> Bool) -> Int { return reduce(0) { n, elem in match(elem) ? n + 1 : n } } } // example usage let isEven = { $0 % 2 == 0 } [1,1,2,4].count(isEven) // returns 2 

如果元素符合Equatable您也可以重载它来计算一个特定的元素:

 extension SequenceType where Generator.Element: Equatable { // overload for count that takes a predicate func count(element: Generator.Element) -> Int { return count { $0 == element } } } [1,1,2,4].count(1) 

结构默认具有对象初始化器的语法:

 struct Person { let name: String; let age: Int; } let person = Person(name: "Fred Bloggs", age: 37) 

并通过ArrayLiteralConvertible ,任何集合types都可以具有与集合初始化程序语法类似的语法:

 let list: MyListImplementation = [1,2,3,4] 

我个人使用CoreData或NSPredicate一些类似LINQ的function。 它确实与Swift啮合。 我只在Objective-C中使用它,但是我已经看到了用Swift实现它的文章。

http://nshipster.com/nspredicate/

也可以看看:

https://github.com/slazyk/SINQ

尽pipeSwift现在已经包含了本地lazy()的function,但有点过时了。

Interesting Posts