Что набор эквивалентен из многомерного массива?

getopt() / getopts() хороший вариант. Украденный от здесь :

простое использование "getopt" показывают в этом мини-сценарии:

#!/bin/bash
echo "Before getopt"
for i
do
  echo $i
done
args=`getopt abc:d $*`
set -- $args
echo "After getopt"
for i
do
  echo "-->$i"
done

то, Что мы сказали, - то, что любой из-a,-b,-c или-d будет позволен, но что-c сопровождается аргументом ("c": говорит это).

, Если мы называем этот "g" и испытываем его:

bash-2.05a$ ./g -abc foo
Before getopt
-abc
foo
After getopt
-->-a
-->-b
-->-c
-->foo
-->--

Мы запускаем с двух аргументов, и "getopt" разбивает опции и помещает каждого в его собственный аргумент. Это также добавило "-".

7
задан r5d 30 July 2015 в 00:58
поделиться

6 ответов

Это довольно распространенный запрос, и большинство людей в конечном итоге пишут какой-нибудь вариант класса Tuple. Если вы используете ASP.Net, вы можете использовать уже доступный класс Triple , в противном случае напишите что-нибудь вроде:

public class Tuple<T, T2, T3>
{
    public Tuple(T first, T2 second, T3 third)

    {
        First = first;
        Second = second;
        Third = third;
    }

    public T First { get; set; }
    public T2 Second { get; set; }
    public T3 Third { get; set; }

}

Существует общий класс из трех кортежей, поэтому вы можете создать новый ] List > () и создайте свои кортежи и добавьте их. Расширьте этот базовый класс с помощью некоторой функции индексирования, и все готово.

Изменить: список со словарем не кажется правильным подходом, потому что каждый словарь содержит только одно значение. Между ключом и значениями нет связи с несколькими записями - есть просто один ключ из нескольких частей и одно связанное значение. Данные эквивалентны строке (или кортежу!) Базы данных.

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

    public class MyTupleList : List<Tuple<string, string, string>>
    {
        public Tuple<string, string, string> this[string first, string second]
        {
            get
            {
                return (this.Find(x => x.First == first && x.Second == second));
            }
            set
            {
                this[first, second] = value;
            }
        }
    }
5
ответ дан 6 December 2019 в 15:25
поделиться

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

Глядя на это, я предполагаю, что первые два столбца служат как " ключ »для других предметов. Определите простую структуру и создайте словарь следующего вида:

struct Key {
   public int Val1 { get; set; }
   public int Val2 { get; set; }
}

....

Dictionary<Key, string> values;

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

4
ответ дан 6 December 2019 в 15:25
поделиться

Учитывая подходящую пару Pair class *, оставлено как упражнение для читатель , вы можете использовать Dictionary , string> .

* Класс с равенством и переопределением хэш-кода, ничего страшного.

3
ответ дан 6 December 2019 в 15:25
поделиться

Подойдет ли вам List > ? Все еще неуклюже, но лучше, чем словари ИМХО.


РЕДАКТИРОВАТЬ: А как насчет Dictionary и сопоставления двух ключей с одной строкой?

var data = new Dictionary<string,string>(StringComparer.Ordinal);

data[GetKey("002", "001")] = "One";

с

string GetKey(string a, string b) {
    return a + "\0" + b;
}
1
ответ дан 6 December 2019 в 15:25
поделиться

Если вам когда-нибудь понадобится найти z по заданному (x, y) (а не, например, найти все ] y по заданному x ), затем используйте это:

Dictionary<KeyValuePair<string, string>, string>

В противном случае ваш словарь в порядке, как есть.

0
ответ дан 6 December 2019 в 15:25
поделиться

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

Например:

public class DynamicTwoDimensonalArray<T>
{
  private List<List<T>> Items = new List<List<T>>();

  public T this[int i1, int i2]
  {
    get
    {
      return Items[i1][i2];
    }
    set
    {
      Items[i1][i2] = value;
    }
  }  
}

Это основная идея, которая поможет вам начать работу; очевидно, что установщик должен иметь дело с проблемами границ. Но это только начало.

Редактировать:

Нет. Как я уже сказал, я бы предпочел индексировать их по строкам. И они не всегда могут быть последовательными (в середине может отсутствовать номер). - Mystere Man

Хм ... это интересно. В этом случае лучше всего было бы создать своего рода конкатенацию комбинации двух индексаторов и использовать ее в качестве ключа в одноуровневом словаре. Я бы по-прежнему использовал собственный класс, чтобы упростить индексацию. Например:

public class TwoDimensionalDictionary
{
  private Dictionary<string, string> Items = new Dictionary<string, string>();

  public string this[string i1, string i2]
  {
    get
    {
      // insert null checks here
      return Items[BuildKey(i1, i2)];
    }
    set
    {
      Items[BuildKey(i1, i2)] = value;
    }
  }
  public string BuildKey(string i1, string i2)
  {
    return "I1: " + i1 + " I2: " + i2;
  }  
}
1
ответ дан 6 December 2019 в 15:25
поделиться
Другие вопросы по тегам:

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