在LINQ中重用输入变量

时间:2015-10-30 03:59:15

标签: c# .net linq

使用多个LINQ运算符时是否可以使用相同的输入变量。
例如:

list.Where(o => o.Name == "John").Average(o => o.Age);

注意,在上面的代码中使用o两次。

2 个答案:

答案 0 :(得分:3)

以下是一个小例子:

class Program
    {
        private static void Main()
        {
            var list = new List<TestClass>
            {
                new TestClass("Name1", 10, new[] {40,50}), new TestClass("Name2", 20, new[] {60,70}), new TestClass("Name3", 30, new[] {80,90}), new TestClass("Name4", 40, new[] {70,20}),
                new TestClass("Name5", 50, new[] {50,40}),new TestClass("Name6", 60, new[] {20,50}),new TestClass("John", 70, new[] {10,20}),new TestClass("John", 80, new[] {40,70})
            };

            var data = list.Where(o => o.Name == "John").Average(o/*Correct Use*/ => o.Age);
            var otherData = list.Where(o => o.Name == "John" && o.Marks.Average(o/*InCorrect use*/ => o) > 35).Average(o/*Correct Use*/ => o.Age);
            Console.WriteLine("data : {0}", data);
            Console.WriteLine("otherData : {0}", otherData);
        }
    }

    class TestClass
    {
        public TestClass(string name, int age, IEnumerable<int> marks)
        {
            Name = name;
            Age = age;
            Marks = marks.ToArray();
        }

        public string Name { get; set; }
        public int Age { get; set; }
        public int[] Marks { get; set; }
    }

您可以在两个不同的表达式中使用相同的变量,但如果在嵌套表达式中使用相同的变量,则会出现编译错误。

答案 1 :(得分:1)

除了上面的答案,这可能有助于更好地可视化查询的范围......

Example

如果您有类似

的内容,则每个框代表一个范围
var o = new Foo();
list.Where(o => o.Name == "Jhon").Average(o => o.Age);

然后您会遇到问题,因为变量o已经分配给Foo的实例。

Example 2