C# LINQ.聚合返回不正确的结果
我很接近,但没有得到完全正确的结果。我想要的是:C# LINQ.聚合返回不正确的结果,c#,string,linq,aggregate,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"); strin
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}'");
如果您想将其作为一个应用程序编写,可以使用:
list.Select(i => $"{field} eq '{i}'").Aggregate((i,j) => $"{i} or {j}");
这(可能)更有效,但在我看来,它也更具可读性:它几乎从字面上解释了你想做什么
两者都产生:
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'"
如果您想将其作为一个应用程序编写,可以使用:
list.Select(i => $"{field} eq '{i}'").Aggregate((i,j) => $"{i} or {j}");
这(可能)更有效,但在我看来,它也更具可读性:它几乎从字面上解释了你想做什么
两者都产生:
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)方式继续使用
聚合
如果有大量项目,可以使用
StringBuilder
进行有效的字符串连接。并且还可以以O(n)方式继续使用
聚合
聚合不计算总和:
i
是您想要的“旧”值。聚合不计算总和:i
是您想要的“旧”值。您可以使用Aggregate
和StringBuilder
作为初始值,并将所有结果附加到它。这将使算法保持在O(n)@WillemVanOnsem您对我的尝试所做的调整产生了错误的结果(尽管您确实教了我更多关于Aggregate()如何工作的知识!)。它给出:波士顿或Market eq“丹佛”或Market eq“旧金山”或Market eq“波特兰”或Market eq“西雅图”。它有一些问题。但是,我确实喜欢您推荐的代码,并将使用它。谢谢@伯德斯:是的,现在已经修好了。当我通过交互式shell运行它时,我意识到了这一点:s@WillemVanOnsem伟大的谢谢您的帮助。@Fabio:问题是,在这种情况下,我们需要处理一个事实,即分隔符不应添加n次,而应添加n-1次。您可以使用Aggregate
和StringBuilder
作为初始值,并将所有结果附加到它。这将使算法保持在O(n)@WillemVanOnsem您对我的尝试所做的调整产生了错误的结果(尽管您确实教了我更多关于Aggregate()如何工作的知识!)。它给出:波士顿或Market eq“丹佛”或Market eq“旧金山”或Market eq“波特兰”或Market eq“西雅图”。它有一些问题。但是,我确实喜欢您推荐的代码,并将使用它。谢谢@伯德斯:是的,现在已经修好了。当我通过交互式shell运行它时,我意识到了这一点:s@WillemVanOnsem伟大的谢谢你的帮助。@Fabio:问题是,在这种情况下,我们需要处理这样一个事实:分隔符不应该被添加n次,而是n-1次。
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();
});