Простейшим (и поэтому, вероятно, лучшим) подходом было бы просто использовать 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 - явный победитель в этом случае.
Я думаю, что это самый простой и лучший подход.
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
имеет больше пар ключ-значение пар).
Полный рабочий пример в этой скрипке .
Все, что вам нужно, это выполнять итерацию, пока вы не достигли конца массива строк, обеспечивая приращение индекса на 2 (имя поля, значение поля).
int i = 1;
var temp = s.Split(',').ToList();
while(i < temp.Count) {
i = i+2;
}
Я бы использовал 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);