相关疑难解决方法(0)

lambda表达式的重点是什么?

阅读本文后,我无法弄清楚为什么使用lambda表达式.公平地说,我认为我没有正确理解委托和表达式树类型是什么,但我不明白为什么有人会使用lambda表达式而不是声明的函数.有人可以开导我吗?

c# lambda delegates

17
推荐指数
2
解决办法
7090
查看次数

循环优化或lambda闭包的问题?

在下面的方法中,我发送一个动作的枚举,并希望一个ICommands数组返回该调用Action<object>包装那些动作(relayCommand所需).

问题是,如果我在for each(或者甚至是for循环)中执行此操作,我会得到始终执行参数中传递的第一个操作的命令.

    public static ICommand[] CreateCommands(IEnumerable<Action> actions)
    {
        List<ICommand> commands = new List<ICommand>();

        Action[] actionArray = actions.ToArray();

        // works
        //commands.Add(new RelayCommand(o => { actionArray[0](); }));  // (_execute = {Method = {Void <CreateCommands>b__0(System.Object)}})
        //commands.Add(new RelayCommand(o => { actionArray[1](); }));  // (_execute = {Method = {Void <CreateCommands>b__1(System.Object)}})

        foreach (var action in actionArray)
        {
            // always add the same _execute member for each RelayCommand (_execute = {Method = {Void <CreateCommands>b__0(System.Object)}})
            commands.Add(new RelayCommand(o => { action(); }));
        }

        return commands.ToArray();
    } …
Run Code Online (Sandbox Code Playgroud)

.net c# lambda language-features loops

10
推荐指数
1
解决办法
1248
查看次数

字典与Func作为关键

我想知道这是否是字典关键词的理智选择?我想要做的是使用表达式作为字典中的键,如:

    var map3 = new Dictionary<Func<int, bool>, int>();
    map3.Add((x) => x % 2 == 0, 1);
    map3.Add((x) => x % 10 == 0, 2);
    // ...

    var key = map3.Keys.SingleOrDefault(f => f(2));
    // key = (x) => x % 2
    // map3[key] = 1
Run Code Online (Sandbox Code Playgroud)

这样做的想法比拥有大的if-else或switch语句更简洁.

这有意义吗?它会起作用吗?有更简单的方法吗?

c# dictionary func

10
推荐指数
2
解决办法
2022
查看次数

为什么LINQ查询后的GC释放WhereListIterator而不是表示条件的Func?

我正在研究一个简单的LINQ查询的内存影响,并注意到LINQ查询创建了2个类型Enumerable+WhereListIterator<Int32>和的额外对象Func<Int32, Boolean>.

使用的代码是这样的:

static void Main(string[] args)
{
    // Setting baseline snapshot
    var list1 = new List<int> { 4862, 6541, 7841 };
    var list2 = new List<int>(list1.Count);
    var list3 = new List<int>(list1.Count);

    // First snapshot: LINQ usage
    list2.AddRange(list1.Where(item => item > 5000 && item < 7000));

    // Second snapshot: foreach-loop
    foreach (var item in list1)
    {
        if (item > 5000 && item < 7000)
        {
            list3.Add(item);
        }
    }

    // End gather
    Console.Read();
}
Run Code Online (Sandbox Code Playgroud)

foreach循环之后的快照中,我注意到 …

.net c# linq garbage-collection

10
推荐指数
1
解决办法
335
查看次数