阅读本文后,我无法弄清楚为什么使用lambda表达式.公平地说,我认为我没有正确理解委托和表达式树类型是什么,但我不明白为什么有人会使用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) 我想知道这是否是字典关键词的理智选择?我想要做的是使用表达式作为字典中的键,如:
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语句更简洁.
这有意义吗?它会起作用吗?有更简单的方法吗?
我正在研究一个简单的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循环之后的快照中,我注意到 …