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个项目。
就表现而言,这有多糟糕?
编辑:这是一个网络应用程序,所以我们谈论的是同时向该页面发出数十个请求,这可能会影响性能。
我想写一些愚蠢的代码来进行演示。此演示的目的是让您看到,在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();
}
}