LINQ过滤对象列表

时间:2014-11-13 03:57:17

标签: c# asp.net .net linq

我有一个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项。

性能方面有多糟糕?

修改:这是一个网络应用,所以我们在谈论让我们一次向这个页面说几十个请求,这可能会影响性能。

1 个答案:

答案 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();

    }
}