如果我们先拿一个简单的例子来说明我的观点(只是一个普通的列表),那么就可以理解了。
消息框会显示2,因为该列表是按引用传递的!我期望IQueryable或IEnumerable(Linq to Sql)列表会有同样的行为,但令我惊讶的是它变成了一个值变量,有人能解释一下吗?即在传递方法后回来,该方法需要过滤列表!根据以下示例:
为什么会这样呢?
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());
}
消息框会显示2,因为该列表是按引用传递的!我期望IQueryable或IEnumerable(Linq to Sql)列表会有同样的行为,但令我惊讶的是它变成了一个值变量,有人能解释一下吗?即在传递方法后回来,该方法需要过滤列表!根据以下示例:
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())
}
为什么会这样呢?