Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何有效地复制列表中的特定值_C#_Arrays_List_Linq - Fatal编程技术网

C# 如何有效地复制列表中的特定值

C# 如何有效地复制列表中的特定值,c#,arrays,list,linq,C#,Arrays,List,Linq,在C#中,如何在列表中复制值? 我已经找到了很多解决方案智能解决方案(特别是在Linq中)来解决如何删除,但没有一个解决方案是关于如何复制的,而且在任何情况下都不能使代码适应我的需要 例如,如果我想复制16-->Lst{0 12 13160 3}-->{0 12 13160 3} 我不需要在它们上循环,但更喜欢单一指令 谢谢你的帮助 Patrick您可以编写自己的扩展方法,使用与默认LINQ方法相同的方法: public static IEnumerable<T> Duplicate

在C#中,如何在列表中复制值? 我已经找到了很多解决方案智能解决方案(特别是在Linq中)来解决如何删除,但没有一个解决方案是关于如何复制的,而且在任何情况下都不能使代码适应我的需要

例如,如果我想复制16-->Lst{0 12 13160 3}-->{0 12 13160 3}

我不需要在它们上循环,但更喜欢单一指令

谢谢你的帮助


Patrick

您可以编写自己的扩展方法,使用与默认LINQ方法相同的方法:

public static IEnumerable<T> Duplicate<T>(this IEnumerable<T> input, T toDuplicate)
{
    foreach(T item in input)
    {
        yield return item;
        if(EqualityComparer<T>.Default.Equals(item, toDuplicate))
        {
            yield return item;
        }
    }
}
公共静态IEnumerable Duplicate(此IEnumerable输入,T toDuplicate)
{
foreach(输入中的T项)
{
收益回报项目;
if(EqualityComparer.Default.Equals(项,toDuplicate))
{
收益回报项目;
}
}
}
用法是

var test = new List<int>() { 0, 0, 12, 13, 16, 0, 3 };
var duplicated = test.Duplicate(16).ToList();
var test=newlist(){0,0,12,13,16,0,3};
var duplicated=test.Duplicate(16.ToList();
试试这个


list.Insert((list.FindIndex(a => a== valueToBeDuplicated) + 1), valueToBeDuplicated));


因此,
FindIndex(a=>a==valueToBeDuplicated)
将获得索引,然后通过添加
+1
将其插入下一个索引。

一个简单但可能不是最优的解决方案是将and运算符组合起来:

var result = source.SelectMany(x => Enumerable.Repeat(x, x == 16 ? 2 : 1));

如果它发生多次呢?全部复制?或者“我不必骑自行车”只是指第一个?您希望对列表进行就地修改,还是希望获得一个新的列表并复制该项?您可以使用
object.Equals()
而不是
=
,使其成为通用列表,但要注意空值!要使其通用,您可以使用类型T:
EqualityComparer.Default.Equals(item,toDuplicate)
@Matthew Watson:谢谢您的提示。我已经更新了答案实际上你应该使用Theodor的建议-虽然
object.Equals()
可以工作,但是你还必须检查null,这是你当前的实现没有做的,如果任何项为null,你将抛出
NullReferenceException
EqualityComparer.Equals()
可以为您实现这一点。这有两个问题。如果列表中没有该值,它将在列表的开头插入该值。此外,它将仅复制该值的第一个实例,而其他答案将复制所有实例(可能需要也可能不需要)。