我有一份会员名单:
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行:
实施例: 第2行:
结果将是:
答案 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