使用 List T 中的 lambda 创建查询字符串

create querystring using lambda from List T

我在创建合适的 select 时遇到了一些困难。

我有我的习惯class:

internal class classA{
        internal string FieldName { get; set; }
        internal string FieldValue { get; set; }
        internal bool IncludeInChecksum { get; set; }
}

我想做的是使用上面的 class 列表构建和连接查询字符串。 对于以下对象:

List<classA> requestParams = ...

查询字符串应如下所示: a=1&b=2&c=3

按 FieldName 升序排列

其中 IncludeInChecksum = true

字段名 = 字段值

            preMD5= requestParams
                .Where(x=>x.IncludeInChecksum)
                .OrderBy(y=>y.FieldName)
                .Aggregate((i,j)=>(i.FieldName+ "=" +j.FieldValue));

这就是我卡住的地方。 提前致谢

我将尝试在 Select() 方法的帮助下获取所有 name=value 字符串。然后将结果转换为数组。之后只需使用 String.Join() 方法即可获得所需的结果。

Join(String, String[]) 连接字符串数组的所有元素,在每个元素之间使用指定的分隔符。

var preMD5= requestParams
                    .Where(x => x.IncludeInChecksum)
                    .OrderBy(y => y.FieldName)
                    .Select(z => string.Format("{0}={1}", z.FieldName, z.FieldValue))
                    .ToArray();
preMD5 = string.Join("&", preMD5);

Aggregate 聚合来自不同行的值。您需要组合来自不同字段的值。为此,您使用 Select:

requestParms.Where(...).OrderBy(...).Select(f=>f.FieldName+"="+f.FieldValue)

这将 return 一个 name=value 字符串的 IEnumerable。您可以使用 string.Join 将它们组合成一个字符串。

我知道有人回答了, 但我仍然想提供我的解决方案。

我使用了专门的方法来构建查询字符串参数, 和一个扩展方法来连接它。

希望对您有所帮助。

public class classA
{
    internal string FieldName { get; set; }
    internal string FieldValue { get; set; }
    internal bool IncludeInChecksum { get; set; }

    public classA(string fieldName, string fieldValue, bool includeInChecksum)
    {
        this.FieldName = fieldName;
        this.FieldValue = fieldValue;
        this.IncludeInChecksum = includeInChecksum;
    }

    public string ToQueryString()
    {
        return string.Format("{0}={1}",
            this.FieldName,
            this.FieldValue);
    }

    public void Test()
    {
        var list = new List<classA> { 
            new classA("A", "1", true) ,
            new classA("D", "4", true) ,
            new classA("B", "2", false)  ,
            new classA("C", "3", true) 
        };

        var result = list.
            Where(o => o.IncludeInChecksum).
            OrderBy(o => o.FieldName).
            Select(o => o.ToQueryString()).
            ToStringEx("&");
    }

}

public static class ExtensionMethods
{
    public static string ToStringEx<T>(this IEnumerable<T> items, string separetor = ",")
    {
        if (items == null)
        {
            return "null";
        }

        return string.Join(separetor, items.Select(o => o != null ? o.ToString() : "[null]").ToArray());
    }

}