2011-11-13 60 views
2
public class Person() 
    { 
    int ID; 
    string Name; 
    DateTime ChangeDate 
    } 



var list1 = new List<Person> 
    { 
     new Person { ID= 1, Name = "Peter", ChangeDate= "2011-10-21" }, 
     new Person { ID= 2, Name = "John", ChangeDate= "2011-10-22" }, 
     new Person { ID= 3, Name = "Mike", ChangeDate= "2011-10-23" }, 
     new Person { ID= 4, Name = "Dave", ChangeDate= "2011-10-24" } 
    }; 

var list2 = new List<Person> 
    { 
     new Person { ID= 1, Name = "Pete", ChangeDate= "2011-10-21" }, 
     new Person { ID= 2, Name = "Johny", ChangeDate= "2011-10-20" }, 
     new Person { ID= 3, Name = "Mikey", ChangeDate= "2011-10-24" }, 
     new Person { ID= 5, Name = "Larry", ChangeDate= "2011-10-27" } 
    }; 

作为输出我想有列表1 +列表2 =加入两个列表比较它们的元素的属性

Person { ID= 1, Name = "Peter", ChangeDate= "2011-10-21" }, 
    Person { ID= 2, Name = "John", ChangeDate= "2011-10-22" }, 
    Person { ID= 3, Name = "Mikey", ChangeDate= "2011-10-24" }, 
    Person { ID= 4, Name = "Dave", ChangeDate= "2011-10-24" } 
    Person { ID= 5, Name = "Larry", ChangeDate= "2011-10-27" } 

,算法是这样的。 加入两个列表。如果列表中的元素具有相同的ID,请使用ChangeDate进行比较,并使用日期更长的ond。如果ChangeDate是eqal,则采取其中任何一种,但不能同时采用两种。 也许它更容易连接两个列表,而不是用lambda过滤它们。我试过了,但总是出来一些难看的代码:/

任何人有什么想法?

+0

如果可以的话,我会用'DateTime'而不是字符串值。 –

回答

4

LINQ

var q = from person in list1.Concat(list2) 
     group person by person.ID into g 
     select g.OrderByDescending(p => p.ChangeDate).First(); 
+1

+1,比我建议的方式简单得多! –

+0

就是这样。非常感谢。我已经应用了解决方案,但忘记标记anwser。对不起,再次感谢! – 100r

0

合并这两个列表按降序排序。现在您需要在排序列表中首次出现每个ID。

1

这样的事情呢?

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Person 
{ 
    public int ID; 
    public string Name; 
    public DateTime ChangeDate; 
} 

public class PersonComparer : IEqualityComparer<Person> 
{ 
    public bool Equals(Person p1, Person p2) 
    { 
     return p1.ID == p2.ID; 
    } 

    public int GetHashCode(Person p) 
    { 
     return p.ID.GetHashCode(); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var list1 = new List<Person> 
     { 
      new Person { ID = 1, Name = "Peter", ChangeDate = DateTime.Parse("2011-10-21") }, 
      new Person { ID = 2, Name = "John", ChangeDate = DateTime.Parse("2011-10-22") }, 
      new Person { ID = 3, Name = "Mike", ChangeDate = DateTime.Parse("2011-10-23") }, 
      new Person { ID = 4, Name = "Dave", ChangeDate = DateTime.Parse("2011-10-24") } 
     }; 

     var list2 = new List<Person> 
     { 
      new Person { ID = 1, Name = "Pete", ChangeDate = DateTime.Parse("2011-10-21") }, 
      new Person { ID = 2, Name = "Johny", ChangeDate = DateTime.Parse("2011-10-20") }, 
      new Person { ID = 3, Name = "Mikey", ChangeDate = DateTime.Parse("2011-10-24") }, 
      new Person { ID = 5, Name = "Larry", ChangeDate = DateTime.Parse("2011-10-27") } 
     }; 

     var pc = new PersonComparer(); 
     var combined = list1.Join(list2, p => p.ID, p => p.ID, (p1,p2) => p2.ChangeDate > p1.ChangeDate ? p2 : p1) 
          .Union(list1.Except(list2, pc)) 
          .Union(list2.Except(list1, pc)); 

     foreach(var p in combined) 
     { 
      Console.WriteLine(p.ID + " " + p.Name + " " + p.ChangeDate); 
     } 
    } 
} 
0

你可以串联和排序,然后得到不同的值:

class PersonIdEqualityComparer : IEqualityComparer<Person> 
{ 
    public bool Equals(Person x, Person y) 
    { 
     return x.ID == y.ID; 
    } 

    public int GetHashCode(Person person) 
    { 
     return person.ID; 
    } 
} 

var result = list1.Concat(list2) 
    .OrderByDescending(i => DateTime.Parse(i.ChangeDate)) // Most recent first 
    .Distinct(new PersonIdEqualityComparer()) 
    ; 

这假定Distinct将采取的第一个项目遇到了各集,而不是任意的项目。考虑到它可能只是将它们插入HashSet而遍历集合,这对我来说似乎是合理的。

它也没有错误检查。如果任何值可能为空,或者ChangeDate可能无效,则此代码将抛出异常。如果这可能是一个问题,我建议你在传入数据之前检查你的数据,并且你在PersonIdEqualityComparer类中做错误检查。