c# - IQueryable 列表不是通过引用吗? (linq 到 sql)

标签 c# linq

如果我们先举一个简单的例子来说明我的观点(只是一个普通的List)

    private void button1_Click(object sender, EventArgs e)
    {
        List<string> Olle = new List<string>();

        Olle.Add("Niklas");
        Olle.Add("Peter");
        Olle.Add("Tobias");

        RemoveFirst(Olle);

        MessageBox.Show(Olle.Count().ToString()); 

    }
    private void RemoveFirst(List<string> O)
    {
        O.Remove(O.First());  
    }

The message box will show 2 be because the list is by reference !

我希望 IQueryable 或 IEnumerable 陷阱列表具有相同的行为, (Linq to Sql) 但令我惊讶的是它变成了一个值变量,有人可以向我解释一下吗? IE。传一个方法回来,这个方法就是过滤列表! 根据下面的例子:

    private void foo(int therecord)
    {
      var FooList = DataContext.MyTable.Where
                    (l => l.ID == therecord).OrderBy(l => l.FirstName).ToList();

       //Lets say the result is 15 records. 
        MessageBox.Show(FooList.Count().ToString());

       //filter method
        RemoveDoubletItems(FooList);


       //Still 15 records - why? It should pass by refernce right? 
       //and show 14 - But its not !    

        MessageBox.Show(FooList.Count().ToString());

    }

    private void RemoveDoubletItems(List<MyTable> FooList)
    {
        var remList = new List<MyTable>();

           remList.Add(FooList.First());//Just an example

           FooList = FooList.Except(remList).ToList();

       //Shows 14 
        MessageBox.Show(FooList.Count().ToString())
    }

这是为什么?

最佳答案

你在这里混淆了两件事。

它不是通过引用传递的。实际上这两个实例都指向相同的引用。

在第一个示例中,您正在修改相同的引用,因此您会在原始列表中看到更改,而在第二个示例中,您将在此处分配一个新引用

FooList = FooList.Except(remList).ToList();

这意味着现在 FooList 没有指向它之前指向的引用。因此您在原始列表中看不到影响。您可以在下图中看到您在做什么。

enter image description here

关于c# - IQueryable 列表不是通过引用吗? (linq 到 sql),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18353729/

相关文章:

c# - 如何让 SingleOrDefault 通过引用从列表中返回对象?

c# - 选择新对象作为参数,同时保留其运行时生成的类型

c# - 你能在asp.net-mvc中强制删除(页面和partialView)OutputCache吗

c# - 如何将 admob 广告加载到 unity 5 项目中?

c# - 为什么我的 for-each 只抛出一个异常?

c# - 如何将文件移动到子目录? C#

c# - 在 LinqToSql 中切换数据库

Linq to SQL 嵌套选择组(按计数)

c# - 嵌套泛型类型参数——如何处理?

asp.net - 从 IEnumerable<T> 获取不同的项目