【问题标题】:In C#, is there a way to convert an array to a Stack<T> without looping?在 C# 中,有没有办法将数组转换为 Stack<T> 而无需循环?
【发布时间】:2025-12-07 17:10:01
【问题描述】:

我有以下代码,它给了我一个 Stack 包含路径的文件夹层次结构:

var path = @"C:\Folder1\Folder2\Folder3\Folder4\Folder5\FileName.ext";

// String array with an element for each level
var folders = path.Split('\\');

var stack = new Stack<string>();

foreach(var folder in folders)
    stack.Push(folder);

var filename = stack.Pop(); // 'FileName.ext'
var parent = stack.Pop(); // 'Folder5'
var grandParent = stack.Pop(); // 'Folder4'

出于好奇,有没有更优雅的方法可以将 folders 数组转换为 Stack 而不使用 foreach 循环?类似于(不存在的)以下内容:

var folders = path.Split('\\').Reverse().ToStack();

期待您的建议!

【问题讨论】:

    标签: c# .net c#-4.0


    【解决方案1】:

    Stack&lt;T&gt; 有一个 constructor 接受 IEnumerable&lt;T&gt;

    【讨论】:

    • 与非通用版本一样。它接受ICollection
    • 太好了,谢谢——我一辈子都想不通为什么我不考虑查看其他重载...
    【解决方案2】:

    你可以使用

    var stack = new Stack(folders);
    

    请注意,这仍然执行循环,它只是为您执行。

    编辑:您的代码使用Stack,但您的标题询问了Stack&lt;T&gt;。这是非通用版本。下定决心:p

    【讨论】:

    • 糟糕,抱歉,我在解释我的实际代码并遗漏了类型参数...不过,这也很有用,所以 +1。
    【解决方案3】:

    如果你真的想要一个ToStack() 方法,你可以创建一个扩展方法:

    public static class Extensions {
        public static Stack<T> ToStack(this IEnumerable<T> sequence) {
            return new Stack<T>(sequence);
        }
    }
    

    或者,正如其他人所说,您可以使用constructor that accepts an IEnumerable&lt;T&gt;
    我猜这是个人喜好问题。

    【讨论】:

      【解决方案4】:

      只需将此 var stack = new Stack&lt;string&gt;(); 替换为 var stack = new Stack&lt;string&gt;(folders);

      【讨论】:

      • 已经有三个答案都描述了使用接受IEnumerable&lt;T&gt;的构造函数重载。第四个这样的答案没有任何新的贡献,也没有用处。
      • @PeterDuniho 绝对正确。我们通过看到 IEnumerable 来理解。但是对于一个踏入编码领域的新程序员来说,这将是一个简单的单线。
      最近更新 更多