我有一个List< Product>在记忆中。它包含我数据库中的所有产品。这保存在缓存中。
根据QueryString,我需要过滤该产品列表并将转发器绑定到它。
所以我将LINQ .Where子句应用到我的列表中,但是你知道Where返回IEnumerable< Product>
所以,如果我有
var category = "Beverages";
var filteredProducts = allProducts.Where(p => p.Category = category);
当我调用filteredProducts.ToList()?
时会发生什么请注意,allProducts是一个List< Product>(),包含大约300个项目。
我猜它会创建一个新的List< Product>在内存中,将从allProducts列表中复制相关项目。
过滤产品约为。 60项。
性能方面有多糟糕?
修改:这是一个网络应用,所以我们在谈论让我们一次向这个页面说几十个请求,这可能会影响性能。
答案 0 :(得分:1)
感觉就像写一些愚蠢的代码用于演示目的。此演示的目的是让您看到在.ToList()
上调用IEnumerable
时,只有对象的引用被复制到新创建的列表中。因此,底层对象在原始列表和新列表中都是相同的。这有两个含义。首先,没有低效的对象深层副本。其次,对原始列表中的项目和新列表中的项目所做的更改将影响两个列表,因为对象在内存中相同。将其添加到控制台应用程序中以查看输出。
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();
}
}