LINQ筛选对象列表

本文关键字:列表 对象 筛选 LINQ | 更新日期: 2023-09-27 18:30:09

我有一个列表<产品>在内存中。它包含我数据库中的所有产品。这将保存在缓存中。

根据QueryString,我需要过滤产品列表,并将中继器绑定到它

所以我将LINQ.Where子句应用到我的列表中,但正如您所知,Where返回IEnumerable<产品>

所以如果我有

var category = "Beverages";
var filteredProducts = allProducts.Where(p => p.Category = category);

当我调用filteredProducts.ToList()时会发生什么?

请注意,所有产品都是一个列表<产品>(),包含大约300个项目。

我猜它将创建一个新的列表<产品>并将从所有产品列表中复制相关项目。

过滤后的产品约为60个项目。

就表现而言,这有多糟糕?

编辑:这是一个网络应用程序,所以我们谈论的是同时向该页面发出数十个请求,这可能会影响性能。

LINQ筛选对象列表

我想写一些愚蠢的代码来进行演示。此演示的目的是让您看到,在IEnumerable上调用.ToList()时,只有对对象的引用才会复制到新创建的列表中。因此,基础对象在原始列表和新列表中都是相同的。这有两个含义。首先,没有低效的对象深度复制。其次,对原始列表中的项目和新列表中的项所做的更改将影响这两个列表,因为对象在内存中是相同的。将其放入控制台应用程序中查看输出。

class Program
{
    class Dog
    {            
        public string name { get; set; }
        public bool isAGoodBoy { get; set;}
        public Dog(string name, bool isAGoodBoy)
        {
            this.name = name;
            this.isAGoodBoy = isAGoodBoy;
        }
    }
    static void Main(string[] args)
    {            
        List<Dog> doges = new List<Dog>();
        doges.Add(new Dog("Rufus", true));
        doges.Add(new Dog("Kevin", false)); //chewed furniture
        doges.Add(new Dog("Maximus", true));
        IEnumerable<Dog> goodBoys = doges.Where(doggy => doggy.isAGoodBoy);
        List<Dog> goodBoysList = goodBoys.ToList();
        foreach (var goodBoy in goodBoysList)   //Iterate over NEW list
        {
            goodBoy.isAGoodBoy = false;    //They wouldn't stop barking
        }
        //From original list! You'll see all of these will output 'False'
        Console.WriteLine("Is Rufus good? " + doges[0].isAGoodBoy.ToString());    
        Console.WriteLine("Is Kevin good? " + doges[1].isAGoodBoy.ToString());    
        Console.WriteLine("Is Maximus good? " + doges[2].isAGoodBoy.ToString());    
        Console.ReadLine();
    }
}