【问题标题】:group inside a list of objects and modify在对象列表中分组并修改
【发布时间】:2020-02-10 05:23:29
【问题描述】:

我从这样的班级得到了一份清单:

List<clsLinkObject> FinalValsLinks = new List<clslinkObject>();

并且该类包含:

public class clsLinkObject
    {
        public string clientCode { get; set; }
        public string clienteName { get; set; }
    public string units { get; set; }

    }

它是通过程序用 FinalValsEnlaces.Add(myLinkObj); 填充的。 所以它最终得到一个可以重复其 clientCode 的对象列表。我需要将重复的分组并添加其单位:

  • 选择所有重复的clientCode。
  • 添加所有这些单位
  • 删除它们并在总数中添加一个。

那么,有什么简单直接的方法可以做到这一点,或者只是遍历它们并创建一个新对象? 如果迭代方式更容易,是创建一个新对象还是修改我拥有的对象更好?

foreach(var objadd in FinalValsLinks)
{//count and add
string tmpclientN= "";
tmpclientN = objadd.clientCode 

...
}

提前致谢。

【问题讨论】:

    标签: c# list object arraylist


    【解决方案1】:

    您可以使用 Linq 实现它。

    下面的 linq 语句,根据clientCode 分组,并返回具有单位总和的分组(唯一)记录。

    finalValsLinks = finalValsLinks.GroupBy(f => f.clientCode).Select(g => 
            {
                var first = g.First();
                return new clsLinkObject() {clientCode = first.clientCode, clienteName = first.clienteName, units = g.Sum(c => c.units)};
            }).ToList();
    

    我已将单位的定义更改为int。如果您需要将单位作为字符串,那么您可以在Sum 操作期间添加int.Parsedouble.Parse

    请参阅为演示场景而创建的 this dotnet fiddle。

    【讨论】:

      【解决方案2】:

      您的情况可以使用GroupBySelect LINQ 函数来回答。但是,我认为在您的特定情况下,这不是一个正确的方法,因为您积累了相同的数据并且支付 LINQ 查询的代价是错误的。

      请记住,LINQ 表达式虽然语法简单,但不会发挥奇迹运行时的作用,实际上是为操作付出代价。

      所以,我的解决方案是像这样使用Dictionary(可能与列表一起使用):

      var dictionary = new Dictionary<string, string>(); //The second string is the type of unit. Which might be wrong.
      
      void AddValue(ClsLinkObject clsLinkObject)
      {
          if(dictionary.ContainsKey(clsLinkObject.clientCode))
          {
              dictionary[clsLinkObject.clientCode] += clsLinkObject.units;
          }
          else
          {
              dictionary.Add(clsLinkObject.clientCode, clsLinkObject.units);
          }
          //You might add to your list as well, if you really want the list here.
      }
      

      您还可以创建一个Collection 类来在一个我非常喜欢的位置处理字典和列表。

      如果您绝对希望按解决方案分组,请告诉我,我会更新。

      附言 您的单位可能不是string。 在 C# 中,使用 PascalCasing 命名类是一种约定

      【讨论】:

        猜你喜欢
        • 2014-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-14
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        相关资源
        最近更新 更多