【问题标题】:Creating a list with elements count dependable from the another list从另一个列表中创建一个元素计数可靠的列表
【发布时间】:2016-01-29 11:04:47
【问题描述】:

标题可能不像我希望的那样准确。我会用一个例子给你看:

List<int> anotherList = new List<int>();
[0] 3
[1] 6
[2] 2
[3] 3
[4] 2
[5] 2
[6] 1

我要创建的List 应该包含乘以anotherList 中的元素的元素。

例如:

List<int> newList = new List<int>();
[0] 3
[1] 3
[2] 3
[3] 6
[4] 6
[5] 6
[6] 6
[7] 6
[8] 6
[9] 2
[10] 2
[11] 3
[12] 3
[13] 3
[14] 2
[15] 2
[16] 2
[17] 2
[18] 1

我知道这个列表对任何人来说似乎完全没用,但我真的需要它来继续我的程序。真的很感激这个帮助!

【问题讨论】:

  • 我不明白你在做什么
  • 你有没有尝试过?使用简单的 foreach 循环似乎很容易完成
  • 没关系。已经从第一个答案中得到了解决方案。

标签: c# .net linq list


【解决方案1】:

LINQ 使用 SelectManyEnumerable.Repeat 让这一切变得简单:

var result = input.SelectMany(x => Enumerable.Repeat(x, x)).ToList();

SelectMany 是一个展平操作:对于原始序列中的每个输入,使用给定的投影生成一个新序列......总体结果是一个包含所有这些“子序列”作为一个展平序列的序列。

从那里,您只需要投影 - 在您的情况下是“对于元素 x,结果是 xx 次”。使用Enumerable.Repeat(x, x) 很容易做到这一点。

【讨论】:

  • 谢谢,但已经实现了@Tamir Vered 的建议:)
  • @goliatpiotr:嗯,它们是完全相同的解决方案,只是缩进不同并且名称不同:)
【解决方案2】:

您可以将LinqEnumerable.RepeatSelectMany 一起使用:

List<int> newList = otherList
    .SelectMany(x => Enumerable.Repeat(x, x))
    .ToList();

SelectMany 扩展方法采用给定谓词选择的IEnumerable&lt;T&gt;s,并将它们展平为一个IEnumerable&lt;T&gt;(不一定与调用该方法的IEnumerable&lt;T&gt; 相同!)

Enumerable.Repeat 方法接收重复某个object 的次数,并返回该object 重复的IEnumerable

【讨论】:

  • SelectMany 采用IEnumerable&lt;IEnumerable&lt;T&gt;&gt; - 它采用IEnumerable&lt;TSource&gt;Func&lt;TSource, IEnumerable&lt;TResult&gt;&gt;
  • 它仍然不是很好 - 听起来它正在采用Ts 的序列并将其展平为...Ts 的序列。每个T 投影到子序列的位很重要。 (看看我在回答中是如何描述的。)
  • 是的,试图让那些不理解Linq的人容易理解而不损害答案的技术准确性有时很难哈哈......重写......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2019-10-26
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
相关资源
最近更新 更多