2016-02-22 3 views
0

У меня есть словарь, который я собираюсь преобразовать в строку запроса.LINQ alternative

var encryptionItems = new Dictionary<string,string>(); 
encryptionItems.Add("customerid", row.CustomerId.ToString()); 
encryptionItems.Add("firstname",model.FirstName); 
encryptionItems.Add("lastname",model.LastName); 

var get = encryptionDal.EncryptDataWithSalt(encryptionItems, salt); 
var linkUri = string.Empty; 
foreach (var item in get) 
{ 
    linkUri = string.Concat(linkUri, item.Key, "=", HttpUtility.UrlEncode(item.Value), "&"); 
} 

Я хочу написать цикл foreach в формате LINQ для оптимизации кода. Не знаю, как это сделать. может ли кто-нибудь мне что-нибудь предложить?

+1

ли LINQ фактически _ «оптимизировать код» _? – MickyD

+1

Если честно, я бы оставил его как есть. LINQ на самом деле не будет более производительным, и в некоторых случаях я считаю, что синтаксис скрывает намерение кода, затрудняющего его работу. – Oliver

+0

@MickyD - Нет, LINQ не «оптимизирует» код с точки зрения производительности. Но он может «оптимизировать» код с точки зрения удобочитаемости. Это очень спорно, хотя. Особенно, если сам разработчик (или члены команды) не используются для LINQ. – Corak

ответ

4

Вам не нужен явный цикл. String.Join() был сделан для этого.

var encrypted = encryptionDal.EncryptDataWithSalt(encryptionItems, salt); // assuming it returns a Dictionary<string, string> 
var queryString = String.Join("&", 
    from kvp in encrypted 
    select $"{WebUtility.UrlEncode(kvp.Key)}={WebUtility.UrlEncode(kvp.Value)}" 
); 

С другой стороны, вам может не потребоваться накладных расходов на использование LINQ. Если вы собираетесь использовать цикл, используйте StringBuilder, если у вас есть потенциально неизвестное количество добавляемых строк.

var encrypted = encryptionDal.EncryptDataWithSalt(encryptionItems, salt); 
var sb = new StringBuilder(); 
foreach (var kvp in encrypted) 
    sb.AppendFormat("&{0}={1}", WebUtility.UrlEncode(kvp.Key), WebUtility.UrlEncode(kvp.Value)); 
var queryString = sb.ToString(1, sb.Length-1); // assuming non-empty 
0
var linkUri = get.Aggregate(string.Empty, 
        (current, item) => string.Concat(current, item.Key, "=", HttpUtility.UrlEncode(item.Value), "&")); 
2

Если честно, я бы оставил его как есть. LINQ на самом деле не будет более производительным, и в некоторых случаях я считаю, что синтаксис скрывает намерение кода, что затрудняет его поддержку.

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

var encryptionItems = new Dictionary<string, string> 
    { 
    {"customerid", row.CustomerId.ToString()}, 
    {"firstname", model.FirstName}, 
    {"lastname", model.LastName} 
    }; 

    var get = encryptionDal.EncryptDataWithSalt(encryptionItems, salt); 
    var linkUri = get.Aggregate(string.Empty, (current, item) => string.Concat(current, item.Key, "=", HttpUtility.UrlEncode(item.Value), "&"));