Почему список, переданный в параметре, не обновляется после вызова метода Filter ()? - PullRequest
0 голосов
/ 14 января 2020
class Program
    {
        static void Main(string[] args)
        {
            var b = new List<MyModel>
            {
                new MyModel { Id = 1},
                new MyModel { Id = 2},
                new MyModel { Id = 3},
            };
            var a = new List<int> { 1 };

            Filter(a, b);
        }

        private static void Filter(IEnumerable<int> a, List<MyModel> b)
        {
            b = b.Where(u => a.Contains(u.Id)).ToList();
        }
    }

    public class MyModel
    {
        public int Id { get; set; }
    }

Я ожидаю, что список b будет содержать только элемент с идентификатором 1. Список не фильтруется после вызова метода Filter.

Ответы [ 2 ]

3 голосов
/ 14 января 2020

Вам следует немного обновить свой код

static void Main(string[] args)
{
    var b = new List<MyModel>
    {
        new MyModel { Id = 1},
        new MyModel { Id = 2},
        new MyModel { Id = 3},
    };

    var a = new List<int> { 1 };
    b = Filter(a, b);
}

private static List<MyModel> Filter(IEnumerable<int> a, List<MyModel> b)
{
    return b.Where(u => a.Contains(u.Id)).ToList();
}

Where метод возвращает новое значение IEnumerable<MyModel>, и вы должны вернуть это значение, оцененное в список, из Filter метод и присвоить обратно b переменная

2 голосов
/ 14 января 2020

В дополнение к отличному ответу Павла, это также хорошее время для изучения ключевого слова ref:

private static void Filter(IEnumerable<int> a, ref List<MyModel> b)
{
    b = b.Where(u => a.Contains(u.Id)).ToList();
}

Добавление ref к параметру b в функции Filter означает, что список, переданный функции, может быть изменены в функции. Другими словами, список будет изменен в Main без необходимости устанавливать в него возвращаемое значение функции, поскольку вы ожидали, что он будет работать в исходном коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...