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

时间:2010-01-09 05:05:13

标签: c# .net linq iteration

关于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);

4 个答案:

答案 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));