这是我的代码
class Student
{
some code
}
static class Filter
{
static void TypeFilter(this List<Student> result, string type)
{
result = result.FindAll(x=>x.type == type);
}
}
当我使用像
这样的扩展方法时 List<Student> a = some code;
a.TypeFilter("someType");
列表 a 未过滤,列表应该是参考类型,为什么 a 没有更改,我做错了什么?
答案 0 :(得分:4)
这就是为什么你;没有看到结果:
static void TypeFilter(this List<Student> result, string type)
{
result = result.FindAll(x=>x.type == type);
}
List<Student> a = some code;
a.TypeFilter("someType");
defualt的参数按值传递。 result
现在是引用列表的局部变量。当您致电FindAll
时 - 您会收到新引用 - result
(和a
)引用未更改的原始列表。
当您将结果重新分配给result
时,result
现在引用新对象,并且返回a
的链接已损坏。所有这些都保持a
不变。
大多数Linq方法返回一个新对象,而不是修改传入的对象。如果您遵循该模式,您的方法将是
static List<Student> TypeFilter(this List<Student> result, string type)
{
return result.FindAll(x=>x.type == type);
}
,用法是:
List<Student> a = some code;
a = a.TypeFilter("someType");
答案 1 :(得分:3)
您可以使用RemoveAll
:
static void TypeFilter(this List<Student> result, string type)
{
result.RemoveAll(x=>x.type != type);
}
答案 2 :(得分:2)
你不能这样分配它试试这个:
static List<Student> TypeFilter(this List<Student> result, string type)
{
return result.FindAll(x=>x.type == type);
}
像这样使用:
List<Student> a = some code;
List<Student> filteredStudentList = a.TypeFilter("someType");
答案 3 :(得分:0)
A是引用类型,但在调用FindAll时创建了新的List。 FindAll是一个返回新List的函数。它等同于foolow方法:
List<Student> FindAll (List<Student> students, string filter){
List<Student> newList = new List<Student>();
foreach(var student in students){
if(filter == student.type)
newList.Add(student);
}
return newList;
}
如果要使用返回值,则需要通过创建变量来捕获对返回值的引用:
var filteredStudents = students.TypeFilter(&#34; someFilter&#34;);
答案 4 :(得分:0)
您无法在引用方法中指定this
指针,并且任何采用参数的方法都无法在不将其作为ref
参数的情况下分配给它,因此您生成的List
代码无法按照您描述的方式分配给result
。
由于它是List
,您可以迭代并删除项而不是替换指针。
static void TypeFilter(this List<Student> result, string type)
{
foreach(var s in result
.Except(result.FindAll(x => x.type == type))
.ToArray()) // VERY Important - modifying a list while iterating through it will throw an exception!
{ result.remove(s); }
}