【问题标题】:How to copy distinct values from one stack to another [duplicate]如何将不同的值从一个堆栈复制到另一个[重复]
【发布时间】:2023-03-03 10:11:01
【问题描述】:

我有两个整数堆栈 StackAStackB

StackA 具有以下值,但 StackB 没有内容。

StackA
-----
[40]
[11]
[56]
[10]
[11]
[56]

现在我需要将不同的值从 StackA 复制到 StackB。我试过这个

    public static void CopyDistinctValues(Stack<int> source, Stack<int> destination)
    {
        int[] numArray = source.ToArray();
        for (int i = 0; i < numArray.Length; i++)
        {
            if (!destination.Contains(numArray[i]))
            {
                destination.Push(numArray[i]);
            }
        }
    }

它的工作原理,但我不确定它是否是最好的解决方案。

有没有更好的方法来做到这一点或任何内置的方法来实现这一点?

如果能不使用Array就更好了。

【问题讨论】:

    标签: c#


    【解决方案1】:

    最短的方法是:

    stackB = new Stack<int>(stackA.Distinct().Reverse());
    

    需要反向,因为构造函数采用 IEnumerable,而 Stack 的 IEnumerable 实现使其从最后一项开始。

    【讨论】:

    • 但您的代码不是在 CopyDistiinctValues 方法调用中内联工作
    • 我想指出 Distinct 是一个集合操作,因此结果是无序的(参见docs.microsoft.com/en-us/dotnet/api/… 下的注释)。所以不能保证新堆栈的顺序正确。根据 Distinct 的实现方式,它可能会被订购,但此实现细节可能会在以后的 .NET 版本中发生变化。
    【解决方案2】:
                Stack<int> StackA= new Stack<int>();
                StackA.Push(2);
                StackA.Push(3);
                StackA.Push(4);
                StackA.Push(5);
                StackA.Push(2);
                Stack<int> StackB = new Stack<int>();
                StackB = new Stack<int>(StackA.Distinct());
    

    【讨论】:

      【解决方案3】:

      如果你在这种情况下使用 Linq 会怎样

      Stack<int> stacka = new Stack<int>(new[] { 40, 11, 56, 10, 11, 56 });
      Stack<int> stackb = new Stack<int>(stacka.ToArray().Distinct());
      

      【讨论】:

        猜你喜欢
        • 2022-10-17
        • 2018-08-29
        • 2012-09-28
        • 1970-01-01
        • 1970-01-01
        • 2013-11-08
        • 2011-05-23
        • 1970-01-01
        • 2019-08-08
        相关资源
        最近更新 更多