首页 > 解决方案 > C# LINQ 如何更改数据源以及如何防止它?

问题描述

我正在尝试学习如何在 C# 中使用 LINQ。我不希望更改源列表,但不知何故它确实被这段代码改变了。该程序编译并运行没有错误(VS2019,W10,64)。break 语句中的断点显示 LinqList 已更改。有人可以告诉我我的错误在哪里吗?我有一个 zip 文件中的源代码。+

using System;
using System.Collections.Generic;
using System.Linq;

namespace LINQProblem
{
   class Program
    {
        public static List<MyTestClass> LinqList = new List<MyTestClass>();
        static void Main(string[] args)
        {
            // for loop to initialize LinqList
            for ( var i = 0; i < 10; i++ )
            {
                LinqList.Add(new MyTestClass());

                if (i % 2 != 0)
                {
                    LinqList[i].left = i * 10;
                    LinqList[i].isChecked = true;
                }
                else
                {
                    LinqList[i].left = (i + 200) * 10;
                }
                LinqList[i].right = LinqList[i].left + 5;
            }

            // filter LinqList and order by the smallest left
            var filteredData = LinqList 
                .Where(x => x.isChecked )
                .OrderBy(x => x.left ).ToList();

            for (;;)
            {
                filteredData[0].isChecked = false;

                // Re-filter  (more code here but not necessary to illustrate the problem)

                filteredData = filteredData 
                    .Where(x => x.isChecked)
                    .OrderBy(x => x.left).ToList();

                if (filteredData.Count == 0)
                {
                    // everything works to here but now values in LinqList have been changed
                    filteredData = LinqList
                        .Where(x => x.isChecked)
                        .OrderBy(x => x.left).ToList();
                    // filteredData.Count now equal zero because isChecked in LinqList has been changed to false
                    break;
                }
            }
            Console.WriteLine("\nPress any key to exit...");
            Console.ReadLine();
        }
    }
}

namespace LINQProblem
{
    class MyTestClass
    {
        public double left { get; set; }
        public double right { get; set; }
        public bool isChecked { get; set; }
    }
}

标签: c#linq

解决方案


推荐阅读