我很接近,但没有得到非常正确的结果。我想要的是:
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'
答案 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();
});