我有一个清单,例如
List<int> List1 = new List<int>{1, 5, 8, 3, 9};
重复列表中元素以获取{1,1,5,5,8,8,3,3,9,9}的简单方法是什么?
我需要这个的原因是我正在绘制列表中的元素并需要制作一个“步骤图”。
答案 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,但它的内存效率