c# - 移动列表中的多个项目

标签 c#

我有一个实现 IEnumerable<T> 的列表类.
类型 T 是一个复杂类,以字符串成员作为唯一标识符。但仅以 int 作为元素类型来解释就足够了。

我想将多个项目向左移动一步。
示例:
原始列表:0、1、2、34、5 br/> 现在,所有粗体项 (0,3,4) 都应该向左移动(尽可能远)。
结果列表:0, 1, 3, 4, 2, 5

是否有好的算法可以做到这一点?也许只需要使用 LINQ。

编辑:List<T> 的答案名单是受欢迎的。我的类(class)有类似的方法。 (感谢 TylerOhlsen 的提示。)
Edit2:一个选定的项目不应超过另一个选定的项目。

最佳答案

这看起来可行:

public static IEnumerable<T> MoveSelectedLeft<T>(
    this IEnumerable<T> source,
    IEnumerable<int> indicesToMove /* must be in order! */)
{
    using (var itm = indicesToMove.GetEnumerator())
    {
        bool hasNextToMove = itm.MoveNext();
        int nextToMove = hasNextToMove ? itm.Current : -1;

        bool canMoveYet = false;
        T held = default(T);
        int currentIndex = 0;

        foreach (T t in source)
        {
            if (hasNextToMove && nextToMove == currentIndex)
            {
                hasNextToMove = itm.MoveNext();
                nextToMove = hasNextToMove ? itm.Current : -1;
                yield return t;
            }
            else
            {
                if (!canMoveYet)
                {
                    canMoveYet = true;
                }
                else
                {
                    yield return held;
                }
                held = t;
            }

            currentIndex++;
        }

        if (canMoveYet)
            yield return held;
    }
}

称为

foreach (int i in new[] { 0,1,2,3,4,5 }.MoveSelectedLeft(new[] { 0,3,4 }))
{
    Console.WriteLine(i);
}

关于c# - 移动列表中的多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13272894/

相关文章:

c# - 使用泛型但没有基类的工厂类

c# - 将输入字符串转换为干净、可读且浏览器可接受的路由数据

c# - 用于分隔函数中参数的正则表达式

c# - 可移植类库是否支持 XmlTextReader?

c# - 如何在网站中加密第三方api key

c# - 如何在 MVC 中运行控制台应用程序

java - Actionscript 中 "If greater than, then equal to"的简写?

c# - MySql.数据.MySqlClient.MySqlException : 'Unknown column ' Cantidad' in 'field list' '

c# - 找不到方法 : 'System.Threading.Tasks.Task` 1&lt;! !0>

c# - 如何将必要的文件包含到独立客户端项目的输出中?