LINQ.Aggregate返回不正确的结果

时间:2017-10-31 17:55:02

标签: c# string linq aggregate

我很接近,但没有得到非常正确的结果。我想要的是:

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'

2 个答案:

答案 0 :(得分:3)

如果你想把它写成一个aggragate,你可以使用:

Col1 | Col2  
1    | a  
1    | b  
1    | c  
2    | d  
2    | e  
2    | f  
3    | a  
3    | e  
3    | f  

由于list.Select(i => $"{field} eq '{i}'").Aggregate((i,j) => $"{i} or {j}");是您在上一步中获得的结果。因此问题在于我们每次都会附加字符串,使其成为 O(n 2 算法( n 的长度为结果)。

但这是非常低效的。你可能想要的是使用:

i

这可能(可能)更有效率,但在我看来 - 它也更具可读性:它几乎可以解释你想要做什么。

两者都生成:

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

答案 1 :(得分:1)

如果您有大量商品,可以使用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();
                           });