Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ.聚合返回不正确的结果_C#_String_Linq_Aggregate - Fatal编程技术网

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();
                           });