как назвать элементы в группе строк? - PullRequest
2 голосов
/ 26 июля 2011

Say

string[] strGroup=returnStr.split(',');

Как назвать каждый элемент strGroup , если у него есть список значений каждого элемента? Поэтому, когда мне нужно использовать определенный предмет, я просто использую strGroup["LastName"] вместо strGroup[23].

Ответы [ 7 ]

3 голосов
/ 26 июля 2011

Примерно так (сумасшедший разговор LINQ, я знаю)

string returnStr = "Claus,Junker,Jørgensen";

string[] keys = new string[]
{
    "FirstName",
    "MiddleName",
    "LastName"
};

Dictionary<string, string> groups = returnStr.Split(',')
         .Select((x, i) => Tuple.Create(keys[i], x))
         .ToDictionary(k => k.Item1, v => v.Item2);

// Alternative version

Dictionary<string, string> groups = returnStr.Split(',')
         .Zip(keys, (k, v) => new KeyValuePair<string, string>(k, v))
         .ToDictionary(k => k.Key, v => v.Value);
2 голосов
/ 26 июля 2011

Массив не имеет строки indexer , поэтому это невозможно как таковое.

Вам необходимо определить имя для каждой части вашей строки - Split willне сделайте этого за вас.

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

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

1 голос
/ 26 июля 2011

Я вижу много примеров из Словаря, но если вы встраиваете знания о формате строк в свой код, почему бы не сделать его классом? Используйте конструктор, чтобы превратить returnStr в свойства:

class Group
{
    public string FirstName { get; private set;}
    public string LastName { get; private set;}
    [...]

    public Group(string returnStr)
    {
        string[] strGroup=returnStr.split(',');
        [...]
        this.FirstName = strGroup[22];
        this.LastName = strGroup[23];
        [...]
    }
 }

При таком подходе вам не придется поддерживать набор строковых констант. Если это победа или нет, зависит от вашей конкретной проблемы.

1 голос
/ 26 июля 2011

Я подозреваю, что вы пытаетесь использовать split для чтения файла / потока CSV.

Что вы можете сделать, это сохранить первую строку в массиве, используя split, а затем, перебирая строки внутри файла, вы можете ссылаться следующим образом:

string[] strGroup=returnStr.split(',');
var someThing = strGroup[GetIndex("LastName")];

и определите GetIndex следующим образом:

public int GetIndex(string str)
{
    return Array.IndexOf<string>(headerArray, str);
}
0 голосов
/ 26 июля 2011

Если у вас есть только одна строка, используйте тип данных Dictionary<string, string>.

Если у вас есть полный список разделенных строк, используйте DataTable и используйте имена столбцов.

0 голосов
/ 26 июля 2011

Это то, для чего предназначен класс Dictionary<TKey,TValue>.В вашем случае вам нужен Dictionary<string,string>.Однако вам придется инициализировать его один раз, прежде чем вы сможете получить доступ к элементам через их имя.

0 голосов
/ 26 июля 2011

Я думаю, вам нужно искать словарь строк.

string[] data = returnStr.Split(',');
var map = new Dictionary<string, string>();
map["LastName"] = data[23];
map["FirstName"] = data[24]; // or whatever

Теперь используйте карту, а не массив строк.

string firstName = map["FirstName"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...