将重复数据与List中的条件合并

时间:2018-06-14 15:52:25

标签: c# linq

我有一份会员名单:

 List<Members> MyMembers= new List<Members>();

会员班:

public class Members
{
     public int IdKey;
     public string name;
     public string relationBegin;
     public string relationEnd;
     public bool isOriginal;
 }

我需要将重复的IdKey合并为一个。 这可以通过以下方式完成:

MyMembers=MyMembers.GroupBy(x => x.IdKey )
      .Select(g => new Members{ IdKey = g.Key })
      .ToList();

这是有趣的开始。

条件是如果我们检测到重复的IdKey它需要保留具有isOriginal = true的那个(如果两个isOriginal = false,我们将isOriginal留给false但是更新日期的开始和结束,如下一个语句中所述)

此外, 我们需要从两个重复项中保留最低关系页和最高关系结,有时relationBegin或relationEnd可能为空或空。

实施例: 第1行:

  • IsOriginal =真
  • relationBegin = 1/1/2017
  • relationEnd = 10/10/2018

实施例: 第2行:

  • IsOriginal = false
  • relationBegin = 1/1/2015
  • relationEnd = NULL

结果将是:

  • IsOriginal = true
  • relationBegin = 1 /二千〇一十五分之一
  • relationEnd 10/10/2018

1 个答案:

答案 0 :(得分:1)

如果您的Member课程有DateTime而不是字符串日期时间,那会更好。

如果你需要字符串,你可以拥有如下属性。

public class Members
{
    public int IdKey;
    public string name;
    public string relationBegin;
    public string relationEnd;
    public bool isOriginal;

    public DateTime RelationBeginDate
    {
        get { return DateTime.ParseExact(relationBegin, "dd-MM-yyyy hh:mm:ss", CultureInfo.InvariantCulture); }
    }
    public DateTime RelationEndDate
    {
        get { return DateTime.ParseExact(relationEnd, "dd-MM-yyyy hh:mm:ss", CultureInfo.InvariantCulture); }
    }

    public Members(int IdKey, string name, string relationBegin, string relationEnd, bool isOriginal)
    {
        //assign paramters to proper properties
    }
}

,您想要的linq将如下所示。

    MyMembers = MyMembers.GroupBy(x => x.IdKey)
      .Select(g => new Members(
         g.Key, //Id will be same as you shown in question
         g.FirstOrDefault().name, //assuming name will be same in all
         g.Select(x => x.RelationBeginDate).Min().ToString("dd-MM-yyyy hh:mm:ss"), //Min begin date
         g.Select(x => x.RelationEndDate).Max().ToString("dd-MM-yyyy hh:mm:ss"),   //Max end date
         g.Any( x => x.isOriginal))).ToList();      //if isOriginal = true found