2015-01-11 75 views
1

我在創建適當的選擇時遇到了一些困難。使用列表中的lambda創建查詢字符串T

我有我的自定義類:

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

什麼,我試圖做的是建立和使用從上面的類列表concatinate查詢字符串。 以下對象:

List<classA> requestParams = ... 

查詢字符串應該看起來像: 一個= 1 & B = 2 & C = 3

由字段名升序

其中IncludeInChecksum =真

有序

FieldName = FieldValue

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

這是我卡住的地方。 由於事先

+0

您對「Aggregate」工作方式的理解不正確。你可能只想在最後選擇一個「選擇」。 – leppie

+0

那麼你的代碼的結果是什麼? –

+0

沒有結果..我不知道如何從這裏繼續 – Tomerz

回答

1

我將努力讓所有名稱=值字符串與Select()方法的幫助。然後將結果轉換爲數組。之後,只需使用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); 
0

Aggregate聚合來自不同行的值。你需要結合不同領域的值。爲此,您使用Select

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

這將返回name=value串的IEnumerable。您可以使用string.Join將它們合併爲一個字符串。

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

}