C# 静态方法不';不要更改引用类型

C# 静态方法不';不要更改引用类型,c#,.net,asp.net-mvc,extension-methods,ienumerable,C#,.net,Asp.net Mvc,Extension Methods,Ienumerable,我编写了静态方法来从IEnumerable集合中排除一些项 public static void Exclude(this IEnumerable<SelectListItem> list, params object[] excludeValues) { list = list.Where(x => excludeValues.All(y => x.Value != y.ToString())).ToList(); } 不在字段中进行任

我编写了静态方法来从IEnumerable集合中排除一些项

public static void Exclude(this IEnumerable<SelectListItem> list, params object[] excludeValues)
    {
        list = list.Where(x => excludeValues.All(y => x.Value != y.ToString())).ToList();
    }
不在字段中进行任何更改。有趣的是,在结束执行方法之前,列表已经排除了值,但返回时,在模型中我仍然有原始集合。
使方法无效并通过引用修改列表对我来说很重要。

您必须从此方法返回列表。列表是引用类型,所以参数只是对列表的引用,您的赋值使其指向另一个列表,但原始列表仍然存在,并且您调用此方法的引用仍然指向此列表。您可以使用“ref”参数而不是扩展方法来实现它。您可以使用不同的方法来实现它,在参数上使用
foreach
,在列表上使用
RemoveAll
。在这种情况下,“this”关键字不是像ref一样工作吗?我正在通过将新引用指定给旧引用来替换引用。否
并不意味着
ref
,也不能与
ref
一起使用。当前实现中发生的情况是,您将参数引用重定向到一个新列表,但参数按值传递,因此,一旦代码运行这一行,您就有两个不同的列表—一个是在调用方法时使用的列表,另一个是在方法内使用的列表(该列表将在方法结束后立即过期)@ZoharPeled IEnumerable未实现方法RemoveAll
model.StatementTypeSource.Exclude(1, 2);