将扩展方法添加到List

时间:2015-01-13 20:47:36

标签: c#

这是我的代码

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 没有更改,我做错了什么?

5 个答案:

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