[英]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.