我有两个不同类型的列表(因为它们代表两个不同数据库中的两种不同类型):
getUsersFromLocal
我希望消除List上具有相同firstname和lastname的重复项,然后从该列表中获取与list上的对象具有不同firstname和lastname的对象。 PartTwo类中的Firstname =类PartOne中的name和类PartTwo中类PartTwo = surname中的lastname。
我有那段代码,但速度很慢:
$scope
答案 0 :(得分:1)
试试这个:
var HashTable = new Dictionary<Tuple<String,String>,Object>();
foreach (PersonOne person in personOneList)
{
var personTuple = Tuple.Create(person.name, person.surname);
if (!HashTable.ContainsKey(personTuple))
{
HashTable[personTuple] = person;
}
}
foreach (PersonTwo person in personTwoList)
{
var personTuple = Tuple.Create(person.firstname, person.lastname);
if (!HashTable.ContainsKey(personTuple)) {
HashTable[personTuple] = person;
}
}
var myResult = HashTable.Where(x => x.Value is PersonTwo).Select(x => x.Value).Cast<PersonTwo>().ToList();
HashTable(Dictionary)简化了(a)从列表中排除PersonOne类型的人的工作,以及(b)删除了第二人的副本。
第三,它适用于O(N)
时间,而不是O(N^2)
。
答案 1 :(得分:0)
首先,我建议你为Person使用单个类。 如果存在差异,则将父类设为Person,并从Person继承PersonOne和PersonTwo。
对于您现有的设计,我建议您使用IEnumerable而不是List。看看
Stopwatch sw = new Stopwatch();
sw.Start();
List<PersonTwo> difference = personTwoList
.GroupBy(x => new { FirstName = x.firstname.ToLower(), LastName = x.lastname.ToLower() })
.Select(x => x.First())
.Where(x => !personOneList.Any(y => y.name.Equals(x.firstname, StringComparison.InvariantCultureIgnoreCase) && y.surname.Equals(x.lastname, StringComparison.InvariantCultureIgnoreCase)))
.ToList();
sw.Stop();
Console.WriteLine("Time elapsed: {0}", sw.ElapsedTicks);//took 83333ms
Stopwatch sw1 = new Stopwatch();
sw1.Start();
IEnumerable<PersonTwo> difference1 = personTwoList
.GroupBy(x => new { FirstName = x.firstname.ToLower(), LastName = x.lastname.ToLower() })
.Select(x => x.First())
.Where(x => !personOneList.Any(y => y.name.Equals(x.firstname, StringComparison.InvariantCultureIgnoreCase) && y.surname.Equals(x.lastname, StringComparison.InvariantCultureIgnoreCase)));
sw1.Stop();
Console.WriteLine("Time elapsed: {0}", sw1.ElapsedTicks);//took 9ms
Console.ReadLine();
结果基于以下生成的测试数据
for (int i = 0; i < 500; i++)
{
personOneList.Add(new PersonOne
{
surname = "a" + i,
name = "b"+ i
});
personTwoList.Add(new PersonTwo
{
lastname = "a" + i,
firstname = "b" + i
});
}
for (int i = 0; i < 100; i++)
{
personTwoList.Add(new PersonTwo
{
lastname = "c" + i,
firstname = "d" + i
});
}
for (int i = 0; i < 100; i++)
{
personTwoList.Add(new PersonTwo
{
lastname = "a" + i,
firstname = "b" + i
});
}