LINQ替代方案

时间:2016-02-22 06:58:01

标签: c# linq foreach

我有一本字典,我要将其转换为查询字符串。

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), "&");
}

我想用LINQ格式编写foreach循环来优化代码。 不知道该怎么做。谁能建议我什么?

3 个答案:

答案 0 :(得分:4)

您不需要显式循环。 2016-02-19 06:33p.m.是为了做到这一点。

String.Join()

另一方面,您可能不希望使用LINQ的开销。如果您要使用循环,请在要添加可能未知数量的字符串时使用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)}" );

StringBuilder

答案 1 :(得分: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), "&"));

答案 2 :(得分:0)

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