在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中使用map
, filter
和reduce
来复制大部分的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实现它的文章。