在LINQ中使用gentregate()生成字符串时出乎意料的结果



小提琴

实用程序功能:

  public static string GetProperties<T>(string alias="")
    {
       if (alias.Length>0)
       {
          return typeof(T).GetProperties().Select(x => x.Name).Aggregate((x, y) => 
            alias + " = " + alias + "." + x + "," + Environment.NewLine + alias + " = " + alias + "." + y + ",");
       }
       else
       {
           return typeof(T).GetProperties().Select(x => x.Name).Aggregate((x, y) => x + Environment.NewLine + y);
       }
    }

代码

    public class ContainerInLog
    {
        public int ContainerInLogID { get; set; }
        public int ContainerInID { get; set; }
        public int CargoID { get; set; }      
        public int LoadStatus { get; set; }    
    }
    public static void Main()
    {
         string list = GetProperties<ContainerInLog>("y");
        Console.WriteLine(list);
    }

结果:

y = y.y = y.y = y.ContainerInLogID,
y = y.ContainerInID,,
y = y.CargoID,,
y = y.LoadStatus,

预期结果:

ContainerInLogID = y.ContainerInLogID,
ContainerInID = y.ContainerInID,
CargoID = y.CargoID,
LoadStatus = y.LoadStatus,

如果您真的坚持返回整个串联字符串,而不是返回枚举的字符串,我不会在这里使用Aggregate,只需使用string.Join即可。另外,您可以通过在Select内部制定字符串来简化语句。例如:

return string.Join(
    Environment.NewLine,
    typeof(T)
        .GetProperties()
        .Select(x => $"{x.Name} = {alias}.{x.Name},"));

奖励:如果将分离器更改为$",{Environment.NewLine}",则可以删除内联逗号,并且在字符串末端将无法获得最终逗号(示例小提琴(。

@davidg在这里具有更好的解决方案,但是您的聚合出了什么问题:

.Aggregate((x, y) => 
            alias + " = " + alias + "." + x + "," + Environment.NewLine + alias + " = " + alias + "." + y + ",");

Aggregate选择器函数(您的(x,y)(采用以下表格:

Func<TAccumulate,TResult> resultSelector

这意味着在您的情况下, x是累积的汇总结果,例如 "ContainerInLogID = y.ContainerInLogID"

,但是要进行下一个汇总,您再次转换xalias + " = " + alias + "." + x,制作"y = y.y = y.ContainerInLogID"。依此类推,每个属性都添加"y = y."的另一个前缀。

最新更新