Лучшее наименование в классах Tuple, чем "Item1", "Item2" - PullRequest
164 голосов
/ 13 октября 2011

Есть ли способ использовать класс Tuple, но указать названия предметов в нем?

Например:

public Tuple<int, int, int int> GetOrderRelatedIds()

Возвращает идентификаторы для OrderGroupId, OrderTypeId, OrderSubTypeId и OrderRequirementId.

Было бы неплохо, чтобы пользователи моего метода знали, что есть что. (Когда вы вызываете метод, результатом являются result.Item1, result.Item2, result.Item3, result.Item4. Не ясно, какой из них какой.)

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

Ответы [ 13 ]

0 голосов
/ 18 августа 2016

Почему все делают жизнь такой сложной.Кортежи предназначены для временных данных обработки.Постоянная работа с Tuples усложнит понимание кода в какой-то момент.Создание классов для всего может в конечном итоге раздуть ваш проект.

Речь идет о балансе, однако ...

Похоже, ваша проблема - это то, для чего вам нужен класс.И просто для полноты, этот класс ниже также содержит конструкторы.


Это правильный шаблон для

  • Пользовательский тип данных
    • снет больше функциональности.Методы получения и установки также могут быть расширены с помощью кода, получая / устанавливая закрытые члены с шаблоном имени «_orderGroupId», одновременно выполняя функциональный код.
  • Включая конструкторы.Вы также можете включить только один конструктор, если все свойства являются обязательными.
  • Если вы хотите использовать все конструкторы, всплывающее окно, как этот, является правильным шаблоном, чтобы избежать дублирования кода.

public class OrderRelatedIds
{
    public int OrderGroupId { get; set; }
    public int OrderTypeId { get; set; }
    public int OrderSubTypeId { get; set; }
    public int OrderRequirementId { get; set; }

    public OrderRelatedIds()
    {
    }
    public OrderRelatedIds(int orderGroupId)
        : this()
    {
        OrderGroupId = orderGroupId;
    }
    public OrderRelatedIds(int orderGroupId, int orderTypeId)
        : this(orderGroupId)
    {
        OrderTypeId = orderTypeId;
    }
    public OrderRelatedIds(int orderGroupId, int orderTypeId, int orderSubTypeId)
        : this(orderGroupId, orderTypeId)
    {
        OrderSubTypeId = orderSubTypeId;
    }
    public OrderRelatedIds(int orderGroupId, int orderTypeId, int orderSubTypeId, int orderRequirementId)
        : this(orderGroupId, orderTypeId, orderSubTypeId)
    {
        OrderRequirementId = orderRequirementId;
    }
}

Или, если хотите, это действительно просто: вы также можете использовать инициализаторы типа:

OrderRelatedIds orders = new OrderRelatedIds
{
    OrderGroupId = 1,
    OrderTypeId = 2,
    OrderSubTypeId = 3,
    OrderRequirementId = 4
};

public class OrderRelatedIds
{
    public int OrderGroupId;
    public int OrderTypeId;
    public int OrderSubTypeId;
    public int OrderRequirementId;
}
0 голосов
/ 10 января 2016

Вы можете написать класс, содержащий кортеж.

Вам необходимо переопределить функции Equals и GetHashCode

и операторы == и! =.

class Program
{
    public class MyTuple
    {
        private Tuple<int, int> t;

        public MyTuple(int a, int b)
        {
            t = new Tuple<int, int>(a, b);
        }

        public int A
        {
            get
            {
                return t.Item1;
            }
        }

        public int B
        {
            get
            {
                return t.Item2;
            }
        }

        public override bool Equals(object obj)
        {
            return t.Equals(((MyTuple)obj).t);
        }

        public override int GetHashCode()
        {
            return t.GetHashCode();
        }

        public static bool operator ==(MyTuple m1, MyTuple m2)
        {
            return m1.Equals(m2);
        }

        public static bool operator !=(MyTuple m1, MyTuple m2)
        {
            return !m1.Equals(m2);
        }
    }

    static void Main(string[] args)
    {
        var v1 = new MyTuple(1, 2);
        var v2 = new MyTuple(1, 2);

        Console.WriteLine(v1 == v2);

        Dictionary<MyTuple, int> d = new Dictionary<MyTuple, int>();
        d.Add(v1, 1);

        Console.WriteLine(d.ContainsKey(v2));
    }
}

вернет:

Правда

1012 * Правда *

0 голосов
/ 13 октября 2011

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

public void GetOrderRelatedIds(out int OrderGroupId, out int OrderTypeId, out int OrderSubTypeId, out int OrderRequirementId)

Поскольку ваш кортеж содержит только целые числа, вы можете представить его с помощью Dictionary<string,int>

var orderIds = new Dictionary<string, int> {
    {"OrderGroupId", 1},
    {"OrderTypeId", 2},
    {"OrderSubTypeId", 3},
    {"OrderRequirementId", 4}.
};

но я тоже не рекомендую.

...