有没有办法使用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)
来生成一个以IEnumerable
forms返回的整数序列。
虽然您可以以已经建议的各种方式将结果转换为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
以相同的方式:
values.AddRange(Enumerable.Range(1, 10));