gpt4 book ai didi

c# - 对 IEnumerable 的替换、插入、删除操作

转载 作者:太空狗 更新时间:2023-10-29 22:25:35 25 4
gpt4 key购买 nike

我有一个只接受专有的不可变集合类型的库。我想要一个接受这些集合之一并通过返回包含所做更改的新集合来对该集合执行一些更改的函数。

我想使用 LINQ 语法,而不是将此集合复制到列表并返回。

添加操作对我来说很容易:将可枚举与另一个相连接。但是 Replace(在给定的索引处,返回给定的值而不是 IEnumerable 的值)、Insert(在给定的索引处,返回给定的值,然后继续遍历 IEnumerable)或 Delete(在给定的索引处,跳过 IEnumerable 的值)呢? )?

.NET 框架或其他库中是否有类似的函数?如果没有,我将如何实现这些功能?

最佳答案

您可以为这些操作制作自己的扩展:

  • 添加

    public static IEnumerable<T> Add<T>(this IEnumerable<T> enumerable, T value)
    {
    foreach (var item in enumerable)
    yield return item;

    yield return value;
    }

    或:

    public static IEnumerable<T> Add<T>(this IEnumerable<T> enumerable, T value)
    {
    return enumerable.Concat(new T[] { value });
    }
  • 插入

    public static IEnumerable<T> Insert<T>(this IEnumerable<T> enumerable, int index, T value)
    {
    int current = 0;
    foreach (var item in enumerable)
    {
    if (current == index)
    yield return value;

    yield return item;
    current++;
    }
    }

    public static IEnumerable<T> Insert<T>(this IEnumerable<T> enumerable, int index, T value)
    {
    return enumerable.SelectMany((x, i) => index == i ? new T[] { value, x } : new T[] { x });
    }
  • 替换

    public static IEnumerable<T> Replace<T>(this IEnumerable<T> enumerable, int index, T value)
    {
    int current = 0;
    foreach (var item in enumerable)
    {
    yield return current == index ? value : item;
    current++;
    }
    }

    public static IEnumerable<T> Replace<T>(this IEnumerable<T> enumerable, int index, T value)
    {
    return enumerable.Select((x, i) => index == i ? value : x);
    }
  • 删除

    public static IEnumerable<T> Remove<T>(this IEnumerable<T> enumerable, int index)
    {
    int current = 0;
    foreach (var item in enumerable)
    {
    if (current != index)
    yield return item;

    current++;
    }
    }

    public static IEnumerable<T> Remove<T>(this IEnumerable<T> enumerable, int index)
    {
    return enumerable.Where((x, i) => index != i);
    }

然后你可以这样调用:

IEnumerable<int> collection = new int[] { 1, 2, 3, 4, 5 };

var added = collection.Add(6); // 1, 2, 3, 4, 5, 6
var inserted = collection.Insert(0, 0); // 0, 1, 2, 3, 4, 5
var replaced = collection.Replace(1, 22); // 1, 22, 3, 4, 5
var removed = collection.Remove(2); // 1, 2, 4, 5

关于c# - 对 IEnumerable 的替换、插入、删除操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41384035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com