对于Fibers,我们有一个典型的例子:生成Fibonacci数
fib = Fiber.new do
x, y = 0, 1
loop do
Fiber.yield y
x,y = y,x+y
end
end
Run Code Online (Sandbox Code Playgroud)
为什么我们需要光纤呢?我可以用相同的Proc重写这个(实际上是闭包)
def clsr
x, y = 0, 1
Proc.new do
x, y = y, x + y
x
end
end
Run Code Online (Sandbox Code Playgroud)
所以
10.times { puts fib.resume }
Run Code Online (Sandbox Code Playgroud)
和
prc = clsr
10.times { puts prc.call }
Run Code Online (Sandbox Code Playgroud)
将返回相同的结果.
那么纤维有什么优点呢?我可以用Fibers写什么样的东西我不能用lambdas和其他很酷的Ruby功能?
我正在写这样的代码,做一些快速和肮脏的时间:
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
b = DoStuff(s);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Run Code Online (Sandbox Code Playgroud)
肯定有一个方法来调用此位的计时码作为花式schmancy .NET 3.0的λ,而不是(上帝保佑)剪切和粘贴了几次和更换DoStuff(s)用DoSomethingElse(s)?
我知道它可以作为一个Delegate但我想知道lambda方式.
我有一个对象列表,我想删除所有空的对象,除了一个,使用filter和lambda表达式.
例如,如果输入是:
[Object(name=""), Object(name="fake_name"), Object(name="")]
Run Code Online (Sandbox Code Playgroud)
...那么输出应该是:
[Object(name=""), Object(name="fake_name")]
Run Code Online (Sandbox Code Playgroud)
有没有办法为lambda表达式添加赋值?例如:
flag = True
input = [Object(name=""), Object(name="fake_name"), Object(name="")]
output = filter(
(lambda o: [flag or bool(o.name), flag = flag and bool(o.name)][0]),
input
)
Run Code Online (Sandbox Code Playgroud) 我有一个lambda表达式,我希望能够传递并重用.这是代码:
public List<IJob> getJobs(/* i want to pass the lambda expr in here */) {
using (SqlConnection connection = new SqlConnection(getConnectionString())) {
connection.Open();
return connection.Query<FullTimeJob, Student, FullTimeJob>(sql,
(job, student) => {
job.Student = student;
job.StudentId = student.Id;
return job;
},
splitOn: "user_id",
param: parameters).ToList<IJob>();
}
Run Code Online (Sandbox Code Playgroud)
这里的关键是,我希望能够将我在这里使用的lambda表达式传递给调用此代码的方法,因此我可以重用它.lambda表达式是我的.Query方法中的第二个参数.我假设我想要使用Action或Func,但我不太确定它的语法是什么或它是如何工作的.有人可以举个例子吗?
我们有一个函数,它使用了自身内部的非捕获 lambda,例如:
void foo() {
auto bar = [](int a, int b){ return a + b; }
// code using bar(x,y) a bunch of times
}
Run Code Online (Sandbox Code Playgroud)
现在 lambda 实现的功能在其他地方变得需要,所以我将把 lambda 提升foo()到全局/命名空间范围之外。我可以将其保留为 lambda,使其成为复制粘贴选项,或者将其更改为适当的函数:
auto bar = [](int a, int b){ return a + b; } // option 1
int bar(int a, int b){ return a + b; } // option 2
void foo() {
// code using bar(x,y) a bunch of times
}
Run Code Online (Sandbox Code Playgroud)
将其更改为适当的函数是微不足道的,但这让我想知道是否有理由不将其保留为 lambda?有什么理由不只是到处使用 lambda 而不是“常规”全局函数?
有人可以提供一个很好的描述Lambda是什么?我们有一个标签,他们是C#问题的秘密,但我还没有找到一个很好的定义和解释他们是什么.
每个人都在谈论这个'Lambda'是什么?很多人似乎都喜欢它,但我能从中收集到的只是将一大堆代码填入单个表达式的方式.
有人可以告诉我它的真正价值吗?
根据我发现的源代码,lambda表达式基本上是由编译器创建一个带有重载函数调用运算符的类和引用变量作为成员的类实现的.这表明lambda表达式的大小是变化的,并且给定足够的引用变量,其大小可以是任意大的.
一个std::function应该有一个固定的大小,但一定要能包住任何可调用的,包括相同种类的任何lambda表达式.它是如何实现的?如果std::function内部使用指向其目标的指针,那么在std::function复制或移动实例时会发生什么?是否涉及堆分配?
我想在许多字段中订购C#中的对象列表,而不仅仅是一个.例如,假设我有一个名为X的类,它有两个属性A和B,我按顺序有以下对象:
object1 => A ="a",B ="h"
object2 => A ="a",B ="c"
object3 => A ="b",B ="x"
object4 => A ="b" ,B ="b"
我想首先按A属性排序列表,当它们等于时,按B元素排序,所以顺序为:
"a""c"
"a""h"
"b""b"
"b""x"
据我所知,OrderBy方法按一个参数排序.
问题:如何通过多个字段订购C#列表?
非常感谢你
考虑以下对集合的简单操作:
static List<int> x = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var result = x.Where(i => i % 2 == 0).Where(i => i > 5);
Run Code Online (Sandbox Code Playgroud)
现在让我们使用表达式.以下代码大致相当:
static void UsingLambda() {
Func<IEnumerable<int>, IEnumerable<int>> lambda = l => l.Where(i => i % 2 == 0).Where(i => i > 5);
var t0 = DateTime.Now.Ticks;
for (int j = 1; j < MAX; j++)
var sss = lambda(x).ToList();
var tn = DateTime.Now.Ticks;
Console.WriteLine("Using lambda: {0}", tn …Run Code Online (Sandbox Code Playgroud) lambda ×10
c# ×4
c++ ×2
.net ×1
c++11 ×1
closures ×1
delegates ×1
expression ×1
fibers ×1
linq ×1
list ×1
performance ×1
proc ×1
python ×1
ruby ×1
sql-order-by ×1
terminology ×1