簡體   English   中英

LINQ.Aggregate返回錯誤的結果

[英]LINQ.Aggregate returning incorrect results

我已經接近了,但是沒有得到正確的結果。 我想要的是這樣的:

Market eq 'Seattle' or Market eq 'Denver'

等等。這是一些示例代碼:

List<string> list = new List<string>();
list.Add("Seattle");
list.Add("Portland");
list.Add("San Francisco");
list.Add("Denver");
list.Add("Boston");

string field = "Market";

string result = list.Aggregate((i,j) => $"{field} eq '{i}' or {field} eq '{j}'");

這是我從這段代碼中得到的:

Market eq 'Market eq 'Market eq 'Market eq 'Seattle' or Market eq 'Portland'' or Market eq 'San Francisco'' or Market eq 'Denver'' or Market eq 'Boston'

如果您想將其寫為aggragate,則可以使用:

list.Select(i => $"{field} eq '{i}'").Aggregate((i,j) => $"{i} or {j}");

由於i是您在上一步中獲得的結果。 因此,問題在於我們將在這里每次都附加字符串,從而使其成為O(n 2算法(結果的長度為n )。

但這效率很低。 您可能想要使用的是:

string.Join(" or ", list.Select(i => $"{field} eq '{i}'"));

(可能)效率更高,但是-我認為它也更具可讀性:它幾乎可以從字面上解釋您想要做什么。

兩者都產生:

csharp> list.Select(i => $"{field} eq '{i}'").Aggregate((i,j) => $"{i} or {j}");
"Market eq 'Seattle' or Market eq 'Portland' or Market eq 'San Francisco' or Market eq 'Denver' or Market eq 'Boston'"
csharp> string.Join(" or ", list.Select(i => $"{field} eq '{i}'"));
"Market eq 'Seattle' or Market eq 'Portland' or Market eq 'San Francisco' or Market eq 'Denver' or Market eq 'Boston'"

如果您有大量項目,則可以使用StringBuilder進行有效的字符串連接。
並且也可以繼續以O(n)方式使用Aggregate

const string SEPARATOR = " or ";
var query = list.Aggregate(new StringBuilder(),
                           (builder, item) =>
                           {
                               builder.Append(field);
                               builder.Append(" eq ");
                               builder.Append(item);
                               builder.Append(SEPARATOR);
                               return builder;
                           },
                           builder =>
                           {
                               builder.Length -= SEPARATOR.Length;
                               return builder.ToString();
                           });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM