Sim*_*hid 5 .net c# linq ienumerable
我有一个只接受专有的不可变集合类型的库.我希望有一个函数接受其中一个集合,并通过返回包含所做更改的新集合对此集合执行一些更改.
我想使用LINQ语法而不是将此集合复制到List并返回.
添加操作对我来说很容易:将可枚举与另一个连接起来.但是如何替换(在给定的索引处,返回给定的值而不是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;
}
Run Code Online (Sandbox Code Playgroud)
要么:
public static IEnumerable<T> Add<T>(this IEnumerable<T> enumerable, T value)
{
return enumerable.Concat(new T[] { value });
}
Run Code Online (Sandbox Code Playgroud)插入
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++;
}
}
Run Code Online (Sandbox Code Playgroud)
要么
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 });
}
Run Code Online (Sandbox Code Playgroud)更换
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++;
}
}
Run Code Online (Sandbox Code Playgroud)
要么
public static IEnumerable<T> Replace<T>(this IEnumerable<T> enumerable, int index, T value)
{
return enumerable.Select((x, i) => index == i ? value : x);
}
Run Code Online (Sandbox Code Playgroud)去掉
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++;
}
}
Run Code Online (Sandbox Code Playgroud)
要么
public static IEnumerable<T> Remove<T>(this IEnumerable<T> enumerable, int index)
{
return enumerable.Where((x, i) => index != i);
}
Run Code Online (Sandbox Code Playgroud)然后你可以这样打电话:
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4101 次 |
最近记录: |