C# 在列表/IEnumerable中重复数字

C# 在列表/IEnumerable中重复数字,c#,linq,C#,Linq,我有一张单子 List<int> List1 = new List<int>{1, 5, 8, 3, 9}; List List1=新列表{1,5,8,3,9}; 重复列表中的元素以获得{1,1,5,5,8,8,3,3,9}的简单方法是什么 我之所以需要这样做,是因为我正在绘制列表中的元素,需要进行“步进图”。您正试图减少内存分配: // Pre-allocate the space to save time List<int> dups = new Li

我有一张单子

List<int> List1 = new List<int>{1, 5, 8, 3, 9};
List List1=新列表{1,5,8,3,9};
重复列表中的元素以获得{1,1,5,5,8,8,3,3,9}的简单方法是什么


我之所以需要这样做,是因为我正在绘制列表中的元素,需要进行“步进图”。

您正试图减少内存分配:

// Pre-allocate the space to save time
List<int> dups = new List(List1.Count * 2);

// Avoid allocating an enumerator (hopefully!)
for(int i=0; i<List1.Count; i++)
{
  var value = List1[i];
  dups.Add(value);
  dups.Add(value);
}
//预先分配空间以节省时间
List dups=新列表(List1.Count*2);
//避免分配枚举数(希望如此!)

对于(int i=0;i您正试图减少内存分配:

// Pre-allocate the space to save time
List<int> dups = new List(List1.Count * 2);

// Avoid allocating an enumerator (hopefully!)
for(int i=0; i<List1.Count; i++)
{
  var value = List1[i];
  dups.Add(value);
  dups.Add(value);
}
//预先分配空间以节省时间
List dups=新列表(List1.Count*2);
//避免分配枚举数(希望如此!)
对于(int i=0;i我将创建(扩展)方法,该方法枚举源并生成每个项目所需的次数:

public static IEnumerable<T> RepeatItems<T>(this IEnumeable<T> source, int count)
{
    foreach(var item in source)
       for(int i = 0; i < count; i++)
          yield return item;
}
如果只需要复制项目,则解决方案更简单:

public static IEnumerable<T> DuplicateItems<T>(this IEnumeable<T> source)
{
    foreach(var item in source)
    {
        yield return item;
        yield return item;
    }
}
另外,如果只枚举结果,则不需要将其转换为列表。如果不从结果中修改(添加/删除)项,则将其转换为数组更有效。

我将创建(扩展)方法,该方法枚举源并生成每个项所需的次数:

public static IEnumerable<T> RepeatItems<T>(this IEnumeable<T> source, int count)
{
    foreach(var item in source)
       for(int i = 0; i < count; i++)
          yield return item;
}
如果只需要复制项目,则解决方案更简单:

public static IEnumerable<T> DuplicateItems<T>(this IEnumeable<T> source)
{
    foreach(var item in source)
    {
        yield return item;
        yield return item;
    }
}

另外,如果只枚举结果,则不需要将其转换为列表。如果不从结果中修改(添加/删除)项,则将其转换为数组更有效。

摘自上述注释

var sequence2 = List1.SelectMany(x => Enumerable.Repeat(x, 2));

是一个更好的解决方案,因为它避免了无意义的内存分配。在开销变化更显著的情况下,将重复更改为
n
也会更简单。

摘自上面的评论

var sequence2 = List1.SelectMany(x => Enumerable.Repeat(x, 2));

是一个更好的解决方案,因为它避免了无意义的内存分配。在开销变化更显著的情况下,更改为
n
重复也会更简单。

可能希望使lambda
x=>成为新的[]{x,x}
为每个元素节省另一个
列表的开销。+1尽管如此;)@Jamiec出于所有目的,两者的开销几乎没有差别。它们都会为每个元素分配一个大小为2的数组。您可以尝试使用
x=>Enumerable。重复(2,x)
相反。这可能会降低GC开销。@Aron,我已经让你对答案进行了注释,这是一个更好的解决方案,尽管你将参数颠倒了。可能需要将lambda
x=>new[]{x,x}
以节省每个元素的另一个
列表的开销。+1;)@jamice,这两种方法的开销差别很小。它们都会为每个元素分配一个大小为2的数组。您可以尝试使用
x=>Enumerable。请重复(2,x)
。这可能会降低GC开销。@Aron,我已经让你对答案进行了评论,这是一个更好的解决方案,虽然参数是反向的。为什么不将当前值赋给局部变量并使用两次呢?为什么不将当前值赋给局部变量并使用两次呢?
RepeatItems
看起来像是可枚举的重复。Repeat
@Jodrell no,
RepeatItems
创建一个序列,在该序列中重复原始序列的每个项目。默认的
Repeat
仅从重复的单个项目创建序列
RepeatItems
看起来像是可枚举的
的副本。Repeat
@Jodrell no,
RepeatItems
在原始序列的每个项目重复的位置创建序列。默认的
Repeat
只是从单个重复项创建序列,我不知道内存使用情况,我可以相信两元素数组比
Enumerable.Repeat
@Rawling创建的迭代器小,但两元素数组及其迭代器比
Enumerable.Repeat创建的迭代器大。更不用说首先编写数组的开销了。我不知道内存使用情况,我可以相信两元素数组比
Enumerable.Repeat
@Rawling创建的迭代器小。但是两元素数组及其迭代器比
Enumerable.Repeat创建的迭代器大。更不用说一开始就有写数组的开销了。