有没有办法使用 LINQ 表达式填充集合?(Is there a way to fill a collection using a LINQ expression?)

问题

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);
回答1

正如其他人所说,您可以使用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

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

IList<int> intList = Enumerable.Range(1, 10).ToList();
回答3

我认为您在特定情况下要寻找的是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
回答4

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

更多相关内容:请点击查看