Swift 中的某些东西类似于 C# 中的 LINQ
Is something in Swift like LINQ in C#
我知道 Swift 还比较新,但我想知道 Swift 在 C# 中是否有类似 LINQ 的东西?
对于 LINQ,我指的是所有出色的工具,例如 标准查询运算符 、Anonymous types、对象初始化程序 等
我个人会使用 CoreData 或 NSPredicate 来实现某些类似 LINQ 的功能。我确定它与 Swift 相吻合。我只在 Objective-C 中使用过它,但我看到人们用 Swift 实现它的文章。
Swift 结合了 .net 中作为 LINQ 捆绑在一起的几个功能,尽管可能不是开箱即用的感觉。
匿名类型与 Swift 中具有命名值的元组非常接近。
在 C# 中:
var person = new { firstName = "John", lastName = "Smith" };
Console.WriteLine(person.lastName);
Output: Smith
在Swift中:
var person = (firstName: "John", lastName: "Smith")
person.firstName = "Fred"
print(person.lastName)
Output: Smith
LINQ 查询当然非常 powerful/expressive,但您可以在 [=57] 中使用 map
、filter
和 reduce
复制它们所做的大部分工作=].使用 lazy
,您可以获得与创建可提前循环的对象相同的功能,并且仅在循环实际发生时才对其求值:
在 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 [=13=]:
.map { ([=13=].someProperty, [=13=].otherProperty) }
for result in results {
print(result)
}
Swift 泛型使类似于现有 LINQ 功能的编写操作变得非常简单。例如,来自 LINQ wikipedia article:
Count
The Count operator counts the number of elements in the given collection. An overload taking a predicate, counts the number of elements matching the predicate.
在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 = { [=14=] % 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 { [=15=] == element }
}
}
[1,1,2,4].count(1)
默认情况下,结构具有类似对象初始化程序的语法:
struct Person { let name: String; let age: Int; }
let person = Person(name: "Fred Bloggs", age: 37)
并且通过 ArrayLiteralConvertible
,任何集合类型都可以具有与集合初始值设定项语法相似的语法:
let list: MyListImplementation = [1,2,3,4]
另请参阅:
https://github.com/slazyk/SINQ
虽然它有点过时了,因为 Swift 现在包含原生的 lazy() 功能。
我知道 Swift 还比较新,但我想知道 Swift 在 C# 中是否有类似 LINQ 的东西?
对于 LINQ,我指的是所有出色的工具,例如 标准查询运算符 、Anonymous types、对象初始化程序 等
我个人会使用 CoreData 或 NSPredicate 来实现某些类似 LINQ 的功能。我确定它与 Swift 相吻合。我只在 Objective-C 中使用过它,但我看到人们用 Swift 实现它的文章。
Swift 结合了 .net 中作为 LINQ 捆绑在一起的几个功能,尽管可能不是开箱即用的感觉。
匿名类型与 Swift 中具有命名值的元组非常接近。
在 C# 中:
var person = new { firstName = "John", lastName = "Smith" }; Console.WriteLine(person.lastName);
Output:
Smith
在Swift中:
var person = (firstName: "John", lastName: "Smith") person.firstName = "Fred" print(person.lastName)
Output:
Smith
LINQ 查询当然非常 powerful/expressive,但您可以在 [=57] 中使用 map
、filter
和 reduce
复制它们所做的大部分工作=].使用 lazy
,您可以获得与创建可提前循环的对象相同的功能,并且仅在循环实际发生时才对其求值:
在 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 [=13=]: .map { ([=13=].someProperty, [=13=].otherProperty) } for result in results { print(result) }
Swift 泛型使类似于现有 LINQ 功能的编写操作变得非常简单。例如,来自 LINQ wikipedia article:
Count The Count operator counts the number of elements in the given collection. An overload taking a predicate, counts the number of elements matching the predicate.
在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 = { [=14=] % 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 { [=15=] == element }
}
}
[1,1,2,4].count(1)
默认情况下,结构具有类似对象初始化程序的语法:
struct Person { let name: String; let age: Int; }
let person = Person(name: "Fred Bloggs", age: 37)
并且通过 ArrayLiteralConvertible
,任何集合类型都可以具有与集合初始值设定项语法相似的语法:
let list: MyListImplementation = [1,2,3,4]
另请参阅:
https://github.com/slazyk/SINQ
虽然它有点过时了,因为 Swift 现在包含原生的 lazy() 功能。