在List / IEnumerable中重复数字

时间:2014-01-28 10:16:32

标签: c# linq

我有一个清单,例如

List<int> List1 = new List<int>{1, 5, 8, 3, 9};

重复列表中元素以获取{1,1,5,5,8,8,3,3,9,9}的简单方法是什么?

我需要这个的原因是我正在绘制列表中的元素并需要制作一个“步骤图”。

4 个答案:

答案 0 :(得分:7)

var list2 = List1.SelectMany(x => new []{x, x}).ToList();

答案 1 :(得分:3)

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

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;
}

因此,您将避免创建大量数组。用法:

var result = List1.RepeatItems(2).ToList();

如果您只需要复制项目,那么解决方案就更简单了:

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

DuplicateItems扩展名的使用:

var result = List1.DuplicateItems().ToList();

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

答案 2 :(得分:2)

取自上述评论,

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

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

答案 3 :(得分:0)

你正试图减少内存分配:

// 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);
}

这不是Linq,但它的内存效率