有没有办法使用LINQ表达式填充集合?

LINQ的一大优点是允许您获取与集合相关的信息,而无需手动编写代码来迭代集合。 有没有办法使用LINQ来填充集合,从而避免编写循环?


例如,假设我有以下代码,它适用于从1到10的一系列数字:

public static void LinqTest() { List intList = new List(); for (int i = 1; i <= 10; i++) //  x % 2 == 1).Sum(); double intAverage = intList.Average(); Console.WriteLine("Sum is {0}\tSum of Odds is {1}\tAverage is {2}", intSum, intSumOdds, intAverage); } 

LINQ已经取代了检索有关数据信息所需的for循环。 我很好奇LINQ可以用来替换填充数据的for循环。 有没有办法使用LINQ替换以下两行代码?

  for (int i = 1; i <= 10; i++) intList.Add(i); 

正如其他人所说,你可以使用Enumerable.Range(int, int)来生成一个以IEnumerableforms返回的整数序列。

虽然您可以以已经建议的各种方式将结果转换为List ,但只有在您确实需要List时才应该这样做。

在这种情况下,没有必要这样做。 您的function可以重写如下:

 IEnumerable intList = Enumerable.Range(1, 10); int intSum = intList.Sum(); int intSumOdds = intList.Where(x => x % 2 == 1).Sum(); double intAverage = intList.Average(); 

这是更有效的,因为Enumerable.Range返回的序列是在枚举时“懒洋洋地”生成的。 另一方面,当序列转换为List所有值必须立即保存在内存中。

你不会用LINQ填充现有的列表; 您将创建一个Enumerable,然后将其转换为列表。 在这种情况下,它就像

 IList intList = Enumerable.Range(1, 10).ToList(); 

我认为你在具体案例中寻找的是Enumerable.Range() 。 从那里,如果你愿意,你可以使用Where s等过滤列表。 例如,如果我想要2的幂的所有数字都低于100,我会做类似Enumerable.Range(1,100).Where(i => i * i < 100)事情。 这在像Haskell这样的函数式语言中很常见,其中类似的东西是: filter (\i -> i * i < 100) [1..100]

替换函数的具体示例:

 Enumerable.Range(1,10).Where(x => x%2 == 1).Sum(); //add separate sum and averages here 

List有一个构造函数,它将IEnumerable作为参数。 您可以使用Enumerable.Range生成数字。

 List values = new List(Enumerable.Range(1, 10)); 

如果要将值添加到先前构造的List ,可以使用List.AddRange以相同的方式:

 values.AddRange(Enumerable.Range(1, 10));