2015-12-17 3 views
1

Есть ли способ быстро (т.е. без использования foreach) CONCAT следующим Dictionary:Регистрация ключи и значения из словаря

Dictionary<string, string> g = new Dictionary<string, string>(); 
g.Add("K", "k1"); 
g.Add("L", "l1"); 

в

"[email protected],[email protected]" 

и что о получении этого результата: "K=k1,L=l1"?

Я немного играю с String.Join, но это не похоже на то, что я хочу.

Некоторые предпосылки: У меня есть список пар ключ/значение. Я хочу либо INSERT в моей базе данных (...keys...) VALUES (...values...), либо UPDATE a записи ...,key=value, ....

+0

пожалуйста, вы можете добавить 'string.join (...)' вещь ?? это самая важная часть вопроса ... – cramopy

+0

@cramopy У меня нет ничего больше, чем 'String.Join (", ", g.Keys)', который не то, что я хочу. –

ответ

5

Вы можете сделать это довольно легко с помощью LINQ, он по-прежнему использует foreach под обложками, поэтому он не будет «быстрее», но его должно быть легко читать.

Dictionary<string, string> g = new Dictionary<string, string>(); 
g.Add("K", "k1"); 
g.Add("L", "l1"); 

var keys1 = g.Select(x=>String.Format("{0}[email protected]{0}", x.Key)); 
var result1 = String.Join(",", keys1); 
Console.WriteLine(result1); 

var keys2 = g.Select(x=>String.Format("{0}={1}", x.Key, x.Value)); 
var result2 = String.Join(",", keys2); 
Console.WriteLine(result2); 

Run Code

Первое что мы делаем, мы делаем IEnumerable<String> из пунктов, которые мы хотим, затем мы используем string.Join объединить этот IEnumerable в к одной строке.

EDIT:
Если вы обновляете в к базе данных я рекомендую сбросив этот подход и опробовать некоторые ORM библиотеки, такие как Entity Framework или NHibernate. Они делают все это для вас и облегчают работу с объектами и не беспокоятся о создании динамических запросов.

+0

Спасибо за подсказку. Я обязательно это рассмотрю. Этот конкретный фрагмент кода чрезвычайно динамичен, хотя (это универсальный XML-ридер), поэтому я надеюсь, что эти рамки также помогут мне в этом. –

+0

[Их там много] (https://en.wikipedia.org/wiki/List_of_object-relational_mapping_software#.NET) Осмотритесь, вы можете заполнить ваши потребности. –

0

Самый короткий код, который я могу думать о

string res = string.Join("\n", g.Select(p => "K=" + p.Key + ",L=" + p.Value)); 

Это приводит к

K=K,L=k1 
K=L,L=l1 
1

Вы можете использовать класс расширения на словарь, а также. Это работает то же самое, но затем позволяет вам сделать что-то простое, как

g.ToKeyValueString("{0}[email protected]{1}", ","); 

Класс Helper

internal static class DictionaryHelper 
{ 
    /// <summary> 
    /// Returns a string of key value pairs in the format k1=v1,k2=v2,... 
    /// </summary> 
    /// <typeparam name="TKey"></typeparam> 
    /// <typeparam name="TValue"></typeparam> 
    /// <param name="dictionary"></param> 
    /// <returns></returns> 
    public static string ToKeyValueString<TKey, TValue>(this Dictionary<TKey, TValue> dictionary) 
    { 
     return ToKeyValueString(dictionary, "{0}={1}", ","); 
    } 

    /// <summary> 
    /// Returns a string of key value paris in the format k1=v1{separator}kk2=v2... 
    /// </summary> 
    /// <typeparam name="TKey"></typeparam> 
    /// <typeparam name="TValue"></typeparam> 
    /// <param name="dictionary"></param> 
    /// <param name="seperator">The string separator for the pairs</param> 
    /// <returns></returns> 
    public static string ToKeyValueString<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, string seperator) 
    { 
     return ToKeyValueString(dictionary, "{0}={1}", seperator); 
    } 

    /// <summary> 
    /// Returns a string of key value pairs in the specified format with the specified separator 
    /// </summary> 
    /// <typeparam name="TKey"></typeparam> 
    /// <typeparam name="TValue"></typeparam> 
    /// <param name="dictionary"></param> 
    /// <param name="format">The format string for the key value pairs</param> 
    /// <param name="separator">The string separator for the pairs</param> 
    /// <returns></returns> 
    public static string ToKeyValueString<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, string format, string separator) 
    { 
     var pairs = dictionary.Select(c => string.Format(format, c.Key, c.Value)); 
     return string.Join(separator, pairs); 
    } 
} 
Смежные вопросы