关于LINQ的一个好处是,它允许您获取与集合相关的信息,而无需手动编写代码来迭代集合。 有没有办法使用LINQ来填充集合,从而避免编写循环?
例如,假设我有以下代码,它适用于从1到10的一系列数字:
public static void LinqTest()
{
List<int> intList = new List<int>();
for (int i = 1; i <= 10; i++) // <==== I'm having to use a for loop
intList.Add(i); // here to populate the List.
int intSum = intList.Sum();
int intSumOdds = intList.Where(x => 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);
答案 0 :(得分:4)
您不会使用LINQ填充现有列表;您将创建一个Enumerable,然后将其转换为列表。在这种情况下,它就像
一样简单IList<int> intList = Enumerable.Range(1, 10).ToList();
答案 1 :(得分:4)
正如其他人所说,你可以使用Enumerable.Range(int, int)
生成一个以IEnumerable<int>
形式返回的整数序列。
虽然您可以通过已经建议的各种方式将结果转换为List<int>
,但只有在您确实需要List<T>
时才应该这样做。
在这种情况下,没有必要这样做。您的功能可以按如下方式重写:
IEnumerable<int> 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<int>
时,所有值必须立即保存在内存中。
答案 2 :(得分:2)
我认为你在具体案例中寻找的是Enumerable.Range()
。从那里,如果您愿意,可以使用Where
等过滤列表。例如,如果我想要所有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
答案 3 :(得分:0)
List<T>
有一个构造函数,它以IEnumerable<T>
作为参数。您可以使用Enumerable.Range
生成数字。
List<int> values = new List<int>(Enumerable.Range(1, 10));
如果您要将值添加到之前构建的List<T>
,您可以使用相同的List<T>.AddRange
方式:
values.AddRange(Enumerable.Range(1, 10));