C # универсальный метод для возврата maxId - PullRequest
0 голосов
/ 23 мая 2018

Мне бы хотелось иметь метод, который мог бы выполнять этот код для других моих объектов (например, приз, человек, команда и т. Д.), Поэтому мне не нужно писать один и тот же код несколько раз и простоположить, скажем, GetMaxId (список <человек> человек, человек человек).Каждый из моих объектов имеет свойство Id.Я использую это, поэтому, когда я сохраняю текстовый файл через пользовательский ввод в моем приложении winform, я могу сгенерировать идентификатор, который будет на 1 больше, основываясь на текущем количестве, например, Persons в текстовом файле.

public static int GetMaxId(List<Prize> prizes, Prize prize)
    {
        int maxId = 1;
        if (prizes.Count > 0)
            maxId = prizes.Max(p => p.Id) + 1;

        prize.Id = maxId;
        return prize.Id;
    }

Итак, что я хотел бы видеть в каждом из классов, например, я хочу вернуть идентификатор человека при создании нового человека, но я не хочу изменять код, принимая параметры для Приза и необходимостьизменить его на человека.Мне нужен метод, который принимает общие параметры, поэтому, когда я вызываю его в классе Person, я могу просто передать (список лиц, Person).

Я не знаю, какой тип передать в исходном методетак что я могу использовать его в других классах.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Ну, я думаю, что вам нужна универсальная функция для получения следующего идентификатора коллекции.Вы можете попробовать использовать дженерики.

Примерно так:

public static int GetNextId<T>(List<T> items, Func<T,int> selector)
    {
        if (items.Count < 1)
            return 1;

        return items.Max(selector)+1;
    }

И вы используете такую ​​функцию:

public class Person
    {
        public int PersonID { get; set; }
    }

    public static void Test()
    {
        var persons = new List<Person>()
        {
            new Person() {PersonID=1 },
            new Person() {PersonID=2 },

        };

        var nextId = GetNextId(persons, i => i.PersonID);//returns 3
    }
0 голосов
/ 23 мая 2018

Вот простой пример использования интерфейса, где все ваши вещи будут реализовывать этот IHaveId интерфейс, чтобы убедиться, что они имеют это свойство id.Функция getMaxId является общей и требует, чтобы ваш список был списком вещей со свойствами идентификатора, которые реализуют интерфейс IHaveId.

Вы можете видеть это работающим на https://dotnetfiddle.net/pnX7Ph.

public interface IHaveId {
    int id { get; }
}

public class Thing1 : IHaveId {
    private int _id;
    public Thing1(int id) {
        this._id = id;
    }
    int IHaveId.id {
        get { return this._id; }
    }
}

public class Thing2 : IHaveId {
    private int _id;
    public Thing2(int id) {
        this._id = id;
    }
    int IHaveId.id {
        get { return this._id; }
    }
}   


public static int getMaxId<T>(List<T> list) where T : IHaveId {
    return list.Max(i => i.id);
}


public static void Main()
{
    List<IHaveId> things = new List<IHaveId>();
    for (var i=0; i<5; i++) {
        things.Add(new Thing1(i));
    }
    for (var i=10; i<15; i++) {
        things.Add(new Thing2(i));
    }

    Console.WriteLine("Max id is " + getMaxId(things));
}
...