C# 使用LINQ将项目推入堆栈
如何通过编程将字符串数组推入通用堆栈 字符串数组 堆栈设置 我需要找什么零钱 错误报告:C# 使用LINQ将项目推入堆栈,c#,linq,C#,Linq,如何通过编程将字符串数组推入通用堆栈 字符串数组 堆栈设置 我需要找什么零钱 错误报告: LINQ是一种查询语言/框架。您希望在这里执行的是对集合对象的修改,而不是查询选择-这肯定不是LINQ的设计目的,甚至不是LINQ的功能 但是,您可能想做的是定义一个扩展方法,该扩展方法可用于堆栈类。请注意,在这里使用BCL堆栈类型也是有意义的,这正是您所需要的,而不是使用列表重新创建轮子 如果您还不确信,另一个哲学原因是:LINQ的创建是为了将函数范式引入C/.NET,而函数编程的核心是无副作用的代码。因
LINQ是一种查询语言/框架。您希望在这里执行的是对集合对象的修改,而不是查询选择-这肯定不是LINQ的设计目的,甚至不是LINQ的功能 但是,您可能想做的是定义一个扩展方法,该扩展方法可用于堆栈类。请注意,在这里使用BCL堆栈类型也是有意义的,这正是您所需要的,而不是使用列表重新创建轮子
如果您还不确信,另一个哲学原因是:LINQ的创建是为了将函数范式引入C/.NET,而函数编程的核心是无副作用的代码。因此,将LINQ与状态修改代码相结合将非常不一致。第一个问题是推送返回一个空值。Select需要某个值 您只是在做一个循环,不需要使用链接 因为堆栈在内部存储列表,所以可以通过向列表传递数组来创建列表 那么你的情况呢
List<string> myList = new List<string>(array);
创建列表。Push需要一个返回类型,以便您能够在select子句中使用它。实际上,它返回void。我认为,你的例子是对LINQ的一种可怕的滥用。即使它有效,您也会使用select子句中函数的一个副作用来完成与select的预期任务完全无关的事情。如果有一个ForEach扩展,那么在这里使用LINQ是合理的,但我会避免使用它并坚持使用ForEach循环
foreach (var val in array)
{
slist.Push(val);
}
这在意图上更加清晰,不会让人对你想要完成的事情感到困惑。改变
public void Push(T obj)
到
并忽略返回值
免责声明:我不推荐这样的突变。试试这个
string[] arr = new string[]{"a","f"};
var stack = new Stack<string>();
arr.ToList().ForEach(stack.Push);
虽然这很酷,但它并不比for循环好。为什么要使用扩展方法?stack类似乎是由他编写的,所以imho最好使用普通方法。@Maximillian:仔细看看我的代码。该方法采用堆栈参数,而不是列表参数。他似乎在重新发明轮子,这是没有必要的。啊,你建议为BCL的堆栈类创建一个扩展方法,而不是为他的。好吧,这当然有道理。抱歉误会了。@Maximillian:不用担心是的,我最初并没有明确表示我是在指导他使用Stack。是的,现在我明白了linq的用途了!谢谢
public static void PushRange<T>(this Stack<T> source, IEnumerable<T> collection)
{
foreach (var item in collection)
source.Push(item);
}
myStack.PushRange(myCollection);
List<string> myList = new List<string>(array);
foreach (var val in array)
{
slist.Push(val);
}
public void Push(T obj)
public T Push(T obj)
string[] arr = new string[]{"a","f"};
var stack = new Stack<string>();
arr.ToList().ForEach(stack.Push);