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

时间:2015-01-11 08:36:11

标签: c# linq list lambda

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

我有自定义课程:

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

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

List<classA> requestParams = ...

查询字符串应如下所示: A = 1和b = 2和C = 3

按字段名升序排序

其中IncludeInChecksum = true

FieldName = FieldValue

            preMD5= requestParams
                .Where(x=>x.IncludeInChecksum)
                .OrderBy(y=>y.FieldName)
                .Aggregate((i,j)=>(i.FieldName+ "=" +j.FieldValue));
这是我被困的地方。 提前谢谢

3 个答案:

答案 0 :(得分:1)

我会尝试在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);

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我知道它已被回答, 但我仍然想提供我的解决方案。

我使用专用方法构建查询字符串参数, 以及一种连接它的扩展方法。

希望这有帮助。

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());
    }

}