将项目加入单个列表<>

时间:2011-06-07 04:31:39

标签: c# .net linq

我有一个名为EntertainmentEvent的自定义对象列表:

public class EntertainmentEvent
{
    public string Title { get; set; }
    public string TagLine { get; set; }
    public string Overview { get; set; }
    public string ThumbnailUrl { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public string EventTime { get; set; }
    public Reoccurrence Reoccurrence { get; set; }
    public string Url { get; set; }
}

我想将具有相同StartDate的项目合并到一个EntertainmentEvent中,该事件具有连接在一起的两个合并项目的标题。

到目前为止,我有这个:

var duplicateDates = allEvents.Join
(
    allEvents, x => x.StartDate, y => y.StartDate,
    (x, y) => x.Title != y.Title 
    ? new EntertainmentEvent
    {
        Title = string.Format("{0}, {1}", x.Title, y.Title),
        StartDate = x.StartDate
    }
    : null
)
.Where(x => x != null)
.ToList();

这种方法唯一的问题是我得到了重复的项目 - 对于一个错误的日期,duplicateDates列表最终会有两个条目

条目1:Startdate = 1/1/2011,Title =“Item One Title,Item Two Title”

条目2:Startdate = 1/1/2011,Title =“Item Two Title,Item One Title”

我确信有一种更好的编码方式,但迄今为止研究空洞。

谢谢:)

3 个答案:

答案 0 :(得分:2)

您是否尝试过按StartDate分组?然后你可以将所有列出的项目合并为一个

答案 1 :(得分:2)

var result = allEvents
   .GroupBy(e => e.StartDate)
   .Select(gp => new EntertainmentEvent
                        {
                          Title = string.Join(", ", gp), 
                          StartDate = gp.Key 
                        });

答案 2 :(得分:0)

以下内容将会关闭,但您需要添加Null检查以及所有这些。

class Comparer : IEqualityComparer <EntertainmentEvent>
{
   public bool Equals( EntertainmentEvent x, EntertainmentEvent y )
   {
       return x.Startdate == y.Startdate;
   }

   public int GetHashCode( EntertainmentEvent event )
   {
      return event.StartDate.GetHashCode();
   }

}

var duplicateDates = allEvents.Join
(
    allEvents, x => x.StartDate, y => y.StartDate,
    (x, y) => x.Title != y.Title 
    ? new EntertainmentEvent
    {
        Title = string.Format("{0}, {1}", x.Title, y.Title),
        StartDate = x.StartDate
    }
    : null
)
.Where(x => x != null)
.Distinct( new Comparer() )
.ToList();