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" разбивает опции и помещает каждого в его собственный аргумент. Это также добавило "-".
Это довольно распространенный запрос, и большинство людей в конечном итоге пишут какой-нибудь вариант класса 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;
}
}
}
Я думаю, это действительно зависит от того, что вы здесь моделируете. Если вы планируете использовать объектно-ориентированный подход, вам не следует думать об этом как о произвольных элементах внутри структуры данных.
Глядя на это, я предполагаю, что первые два столбца служат как " ключ »для других предметов. Определите простую структуру и создайте словарь следующего вида:
struct Key {
public int Val1 { get; set; }
public int Val2 { get; set; }
}
....
Dictionary<Key, string> values;
Очевидно, что ключ и элементы внутри него должны быть сопоставлены с чем-то более близким к тому, что вы представляете.
Учитывая подходящую пару Pair
class *, оставлено как упражнение для читатель , вы можете использовать Dictionary
.
* Класс с равенством и переопределением хэш-кода, ничего страшного.
Подойдет ли вам 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;
}
Если вам когда-нибудь понадобится найти z
по заданному (x, y)
(а не, например, найти все ] y
по заданному x
), затем используйте это:
Dictionary<KeyValuePair<string, string>, string>
В противном случае ваш словарь в порядке, как есть.
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;
}
}