使用LINQ将项目推入堆栈

我如何以编程方式将字符串数组推入通用堆栈?

字符串数组

string[] array=new string[]{"Liza","Ana","Sandra","Diya"}; 

堆栈设置

  public class stack { private int index; List list; public stack() { list = new List(); index=-1; } public void Push(T obj) { list.Add(obj); index++; } ........... } 

我需要改变什么?

 stack slist = new stack(); var v = from vals in array select (p => slist.Push(p)); 

错误报告 :

  select子句中表达式的类型不正确。 

LINQ是一种查询语言/框架。 你想在这里执行的是对集合对象的修改而不是查询(选择) – 这肯定不是 LINQ设计用于(或甚至能够)的。

但是,您可能想要做的是为Stack类定义一个扩展方法。 请注意,这里使用BCL Stack类型也是有意义的,这正是您所需要的,而不是使用List重新发明轮子。

 public static void PushRange(this Stack source, IEnumerable collection) { foreach (var item in collection) source.Push(item); } 

然后,您可以执行以下操作:

 myStack.PushRange(myCollection); 

如果您还没有确信,另一个哲学原因是:LINQ的创建是为了将函数式范例引入C#/ .NET,而函数式编程的核心是无副作用的代码。 因此,将LINQ与状态修改代码相结合将是非常不一致的。

第一个问题是Push返回一个void。 选择期望值的东西。

你只是做一个循环,不需要使用链接。

由于堆栈是在内部存储列表,因此可以通过传递数组来创建列表。

所以在你的情况下

 List myList = new List(array); 

创建列表。

更改

 public void Push(T obj) 

 public T Push(T obj) 

并忽略返回值。

免责声明:我不建议像这样的变异。

试试这个

 string[] arr = new string[]{"a","f"}; var stack = new Stack(); arr.ToList().ForEach(stack.Push); 

虽然这是“酷”,但并不比for循环更好。

Push需要一个返回类型,以便能够在select子句中使用它。 实际上,它返回void。 我认为,你的例子是对LINQ的可怕滥用。 即使它有效,你也会在select子句中使用函数的副作用来完成与select所针对的任务完全无关的事情。 如果有一个“ForEach”扩展,那么在这里使用LINQ是合理的,但我会避免它并坚持使用foreach循环。

  foreach (var val in array) { slist.Push(val); } 

这意味着更加清晰,并且不会让人对你想要完成的事情感到头疼。