Как отделить строку и значение от словаря?

0
задан Heretic Monkey 2 March 2019 в 15:13
поделиться

4 ответа

Простейшим (и поэтому, вероятно, лучшим) подходом было бы просто использовать string.Split, а затем итерировать массив:

var source = "File_name,cost_per_page,0.23,color_code,343,thickness,0.01";

var splitted = source.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
var result = new Dictionary<string, string>();
// Note: Starting from 1 to skip the "file_name"
// moving 2 indexes in each iteration, 
// and ending at length - 2.
for(int i = 1; i < splitted.Length - 1; i+=2)
{
    result.Add(splitted[i], splitted[i+1]);
}

Я пытался найти умный способ сделать это с linq, но лучшее, что я придумал, на самом деле совсем не так умно:

var valuesWithIndexes = source
    .Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
    .Skip(1)
    .Select((v, i) => new {v, i});

var keys = valuesWithIndexes.Where(x => x.i % 2 == 0);
var values = valuesWithIndexes.Where(x => x.i % 2 == 1);

var dictionary = keys.Zip(values, (k, v) => new {k, v})
    .ToDictionary(key => key.k,
                  val => val.v);

Я думаю, что простой цикл for - явный победитель в этом случае.

0
ответ дан Zohar Peled 2 March 2019 в 15:13
поделиться

Я думаю, что это самый простой и лучший подход.

string str = "File_name,cost_per_page,0.23,color_code,343,thickness,0.01";

string[] array = str.Split(',');
Dictionary<string, double> dict = new Dictionary<string, double>();
for (int i = 1; i < array.Length - 1; i = i + 2)
{
    string key = array[i];
    double value = Double.Parse(array[i + 1], CultureInfo.InvariantCulture);
    dict.Add(key, value);
}

Вы также можете использовать приведенный выше код для большей строки (переменная str имеет больше пар ключ-значение пар).

0
ответ дан elgaspar 2 March 2019 в 15:13
поделиться

Полный рабочий пример в этой скрипке .

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

int i = 1;
var temp = s.Split(',').ToList();
while(i < temp.Count) {
    i = i+2;
}
0
ответ дан jcruz 2 March 2019 в 15:13
поделиться

Я бы использовал linq. Преобразуйте строку в массив с разделителями.

Настройте словарь, содержащий первый элемент ... не уверен, хотите ли вы это сделать. Если нет, просто удалите выражения «d1» и «union».

Запустите Linq, чтобы создать словарь на основе четных чисел.

Тогда, если вы действительно хотите учесть первый элемент, имя_файла, и вы хотите, чтобы это было в начале вашего словаря, то, наконец, вы запустите оператор «союз».

string str = "File_name,cost_per_page,0.23,color_code,343,thickness,0.01";
string[] array = str.Split(',');

Dictionary<string, string> d1 = new Dictionary<string, string>()
{
    { array[0], "" }
};
Dictionary<string, string> d2 = array.Select((i, index) => (index > 0 && index % 2 == 0) ?
    new { key = array[index - 1], value = i } : null).Where(i => i != null).ToDictionary(d => d.key, d => d.value);

Dictionary<string, string> result = d1.Union(d2).ToDictionary(k => k.Key, v => v.Value);

foreach (KeyValuePair<string, string> kvp in result)
    Console.WriteLine(kvp.Key + ": " + kvp.Value);

return;

другой, и, возможно, более чистый подход:

Это также учитывает имя_файла. Если вы не хотите этого, добавьте «index> 0» к условному оператору, где он проверяет четность.

string str = "File_name,cost_per_page,0.23,color_code,343,thickness,0.01";
string[] array = str.Split(',');

Dictionary<string, string> d2 = array.Select((i, index) => (index % 2 == 0) ?
    new 
    {
        key = (index == 0) ? i : array[index - 1],
        value = (index == 0) ? "" : i
    } : null).Where(i => i != null).ToDictionary(d => d.key, d => d.value);

foreach (KeyValuePair<string, string> kvp in d2)
    Console.WriteLine(kvp.Key + ": " + kvp.Value);
0
ответ дан spyder1329 2 March 2019 в 15:13
поделиться
Другие вопросы по тегам:

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