Что лучший способ использовать пара (трижды, и т.д.) значений как одно значение в C#?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
20
задан Community 23 May 2017 в 12:24
поделиться

16 ответов

Я реализовал библиотеку кортежа в C#. Посещение http://www.adventuresinsoftware.com/generics/ и нажимает на ссылку "кортежей".

6
ответ дан 29 November 2019 в 22:43
поделиться

Существуют также Tuple<> вводит в F#; просто необходимо сослаться на FSharp.Core.dll.

0
ответ дан 29 November 2019 в 22:43
поделиться

Нет встроенных классов для этого. Можно использовать KeyValuePair или развернуть собственную реализацию.

0
ответ дан 29 November 2019 в 22:43
поделиться

Вы могли использовать Систему. Наборы. Универсальный. KeyValuePair как Ваша Парная реализация.

Или Вы могли просто реализовать свое собственное, они не тверды:

public class Triple<T, U, V>
{
  public T First {get;set;}
  public U Second {get;set;}
  public V Third {get;set;}
}

, Конечно, можно когда-нибудь столкнуться с проблемой, которые Утраиваются (строка, интервал, интервал) не совместимо с Тройным (интервал, интервал, строка). Возможно, пойдите с Системой. Xml. Linq. XElement вместо этого.

0
ответ дан 29 November 2019 в 22:43
поделиться

Да, существует Система. Сеть. UI.Pair и Система. Сеть. UI.Triplet (который имеет перегруженного создателя для поведения Парного типа!)

0
ответ дан 29 November 2019 в 22:43
поделиться

Для первого случая я обычно использую

Dictionary<KeyValuePair<string, int>, object>
0
ответ дан 29 November 2019 в 22:43
поделиться

Там не создаются ins, но Pair< T, R> класс тривиально для создания.

0
ответ дан 29 November 2019 в 22:43
поделиться

KeyValuePair является лучшим классом, чтобы расшириться, если Вы не хотите создавать свои собственные классы.

int id = 33;
string description = "This is a custom solution";
DateTime created = DateTime.Now;

KeyValuePair<int, KeyValuePair<string, DateTime>> triple =
   new KeyValuePair<int, KeyValuePair<string, DateTime>>();
triple.Key = id;
triple.Value.Key = description;
triple.Value.Value = created;

можно расширить его до стольких уровней, сколько Вы хотите.

KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string, string> quadruple =
   new KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string, string>();

Примечание : классы Пара Триплета и существуют в Система. Сеть -dll, таким образом, это не очень подходит для других решений, чем ASP.NET.

2
ответ дан 29 November 2019 в 22:43
поделиться

Я обычно просто создаю свою собственную структуру, содержа значения. Это часто более читаемо ;)

3
ответ дан 29 November 2019 в 22:43
поделиться

Пара и Триплет являются существующими классами в .NET, см. MSDN:

Пара Триплета

я недавно столкнулся с ними при проигрывании вокруг с состоянием отображения, декодирующим

9
ответ дан 29 November 2019 в 22:43
поделиться
public struct Pair<T1, T2>
{
    public T1 First;
    public T2 Second;
}

public struct Triple<T1, T2, T3>
{
    public T1 First;
    public T2 Second;
    public T3 Third;
}
12
ответ дан 29 November 2019 в 22:43
поделиться

Можно относительно легко создать собственные классы кортежа, единственной вещью, которая потенциально становится грязной, является равенство и переопределения хэш-кода (важный, если Вы собираетесь использовать их в словарях).

нужно отметить, что .NET, собственный KeyValuePair<TKey,TValue> структура, имеет относительно медленное равенство и методы хэш-кода .

Принятие, которое не является беспокойством о Вас, существует все еще проблема, которую код заканчивает тем, что был тверд выяснить:

public Tuple<int, string, int> GetSomething() 
{
    //do stuff to get your multi-value return
}

//then call it:
var retVal = GetSomething();

//problem is what does this mean?
retVal.Item1 / retVal.Item3; 
//what are item 1 and 3?

В большинстве этих случаев я нахожу легче создать определенный рекордный класс (по крайней мере, пока C#4 не делает это волшебство компилятора)

class CustomRetVal {
    int CurrentIndex { get; set; }
    string Message { get; set; }
    int CurrentTotal { get; set; }
}

var retVal = GetSomething();

//get % progress
retVal.CurrentIndex / retVal.CurrentTotal;
2
ответ дан 29 November 2019 в 22:43
поделиться

Встроенные Классы

В определенных конкретных случаях, платформа .NET уже обеспечивает подобные кортежу классы, которые Вы можете усиливать.

Пары и Утраивается

дженерик Система. Наборы. Универсальный. Класс KeyValuePair мог использоваться в качестве специальной парной реализации. Это - класс, который универсальный Словарь использует внутренне.

, С другой стороны, Вы можете уметь обойтись Система. Наборы. Структура DictionaryEntry , которая действует как элементарная пара и имеет преимущество того, чтобы быть доступным в mscorlib. На вниз сторона, однако, то, что эта структура не со строгим контролем типов.

Пары и Утраиваются, также доступны в форме Система. Сеть. UI.Pair и Система. Сеть. Классы UI.Triplet . Даже при том, что классы тезисов живут в Система. Сеть блок они могли бы совершенно подойти для разработки winforms. Однако эти классы не со строгим контролем типов или и не могли бы подойти в некоторых сценариях, могли бы быть такими как общая ставившая целью платформа или библиотека.

кортежи Высшего порядка

Для кортежей высшего порядка, за исключением прокрутки Вашего собственного класса, не может быть простого решения.

, Если Вы установили язык F# , Вы могли бы сослаться FSharp.Core.dll , который содержит ряд универсального неизменный Microsoft. Фа-диез. Ядро. Кортеж классы до универсального sextuples. Однако даже при том, что неизмененный FSharp.Code.dll может быть перераспределен, F# является языком исследования и происходящей работой, таким образом, это решение, вероятно, будет представлять интерес только в академических кругах.

, Если Вы не хотите создавать свой собственный класс и являетесь неудобной ссылкой на библиотеку F#, один изящный прием мог состоять в расширении универсального класса KeyValuePair так, чтобы участником Значения был самостоятельно вложенный KeyValuePair.

, Например, следующий код иллюстрирует, как Вы могли усилить KeyValuePair для создания Утраивания:

int id = 33;
string description = "This is a custom solution";
DateTime created = DateTime.Now;

KeyValuePair<int, KeyValuePair<string, DateTime>> triple =
   new KeyValuePair<int, KeyValuePair<string, DateTime>>();
triple.Key = id;
triple.Value.Key = description;
triple.Value.Value = created;

Это позволяет расширять класс до любого произвольного уровня, как требуется.

KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string>, string> quadruple =
    new KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string>, string>();
KeyValuePair<KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string>, string>, string> quintuple =
    new KeyValuePair<KeyValuePair<KeyValuePair<KeyValuePair<string, string>, string>, string>, string>();

Самокрутка

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

можно создать простые структуры как так:

struct Pair<T, R>
{
    private T first_;
    private R second_;

    public T First
    {
        get { return first_; }
        set { first_ = value; }
    }

    public R Second
    {
        get { return second_; }
        set { second_ = value; }
    }
}

Платформы и Библиотеки

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

20
ответ дан 29 November 2019 в 22:43
поделиться

NGenerics - популярная библиотека алгоритмов и структур данных .Net, недавно представила в набор неизменяемые структуры данных.

Первыми реализованными неизменяемыми классами были классы пар и кортежей . Код хорошо покрыт тестами и довольно элегантен. Вы можете проверить это здесь . В настоящее время они работают над другими неизменными альтернативами, и они должны быть готовы в ближайшее время.

1
ответ дан 29 November 2019 в 22:43
поделиться

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

2
ответ дан 29 November 2019 в 22:43
поделиться

Перенесемся в 2010 год, .NET 4.0 теперь поддерживает n-кортежи произвольного n. Эти кортежи реализуют структурное равенство и сравнение, как и ожидалось.

11
ответ дан 29 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: