我有一个名为MyObject的对象,它包含字段:id、a、b、c、e、f。我还有一个列表,包含500,000个项目,现在如何删除所有具有相同参数a、c、f值的重复项?
我正在寻找最快和最有效的方法。
更新: 我实现了比较器。
我的类中的字段类型不同,因此我使用ToString()方法。这是一个好方法吗? IdLoc、IdMet、Ser是长整型? Value是一个对象? IdDataType是长整型?
时间:0.35秒
但返回的列表不属于我的课程,为什么1和2的列表中元素数量与3的列表不同?
更新2
我正在寻找最快和最有效的方法。
更新: 我实现了比较器。
我的类中的字段类型不同,因此我使用ToString()方法。这是一个好方法吗? IdLoc、IdMet、Ser是长整型? Value是一个对象? IdDataType是长整型?
class Comparer : IEqualityComparer<MyObject>
{
public bool Equals(MyObject x, MyObject y)
{
return x.IdLoc == y.IdLoc && x.IdMet == y.IdMet && x.Ser == y.Ser &&
x.IdDataType == y.IdDataType && x.Time == y.Time && x.Value == y.Value;
}
public int GetHashCode(MyObject obj)
{
string idLoc = obj.IdLoc.HasValue ? obj.IdLoc.ToString() : String.Empty;
string idMet = obj.IdMet.HasValue ? obj.IdMet.ToString() : String.Empty;
string ser = obj.Ser.HasValue ? obj.Ser.ToString() : String.Empty;
string value = obj.Value != null ? obj.Value.ToString() : String.Empty;
return (idLoc + idMet + ser + value + obj.IdDataType.ToString() + obj.Time.ToString()).GetHashCode();
}
}
去除重复项
元素数量为566 890
1) 时间:2秒
DateTime start = DateTime.Now;
List<MyObject> removed = retValTmp.Distinct(new Comparer()).ToList();
double sec = Math.Round((DateTime.Now - start).TotalSeconds, 3);
2) 时间: 1.5 秒
start = DateTime.Now;
List<MyObject> retList = new List<MyObject>();
HashSet<MyObject> removed2 = new HashSet<MyObject>(new Comparer());
foreach (var item in retValTmp)
{
if (!removed2.Contains(item))
{
removed2.Add(item);
retList.Add(item);
}
}
double sec2 = Math.Round((DateTime.Now - start).TotalSeconds, 3);
4) 我也尝试了这种方法:
start = DateTime.Now;
var removed3 = retValTmp.Select(myObj => new { myObj.IdLoc, myObj.IdMet, myObj.Ser, myObj.Value, myObj.IdDataType, myObj.Time }).Distinct().ToList();
double sec3 = Math.Round((DateTime.Now - start).TotalSeconds, 3);
时间:0.35秒
但返回的列表不属于我的课程,为什么1和2的列表中元素数量与3的列表不同?
更新2
public int GetDataHashCode(MyObject obj)
{
long idLoc = obj.IdLoc.HasValue ? obj.IdLoc.Value : 0;
long idMet = obj.IdMet.HasValue ? obj.IdMet.Value : 0;
long ser = obj.SerHasValue ? obj.Ser.Value : 0;
int valueHash = 0;
if (obj.Value != null)
valueHash = obj.Value.GetHashCode();
else
valueHash = valueHash.GetHashCode();
return (idLoc.GetHashCode() + idMet.GetHashCode() + ser.GetHashCode() + valueHash + obj.IdDataType.GetHashCode() + obj.Time.GetHashCode()).GetHashCode();
}
使用:
foreach (MyObject daItem in retValTmp)
{
int key = GetDataHashCode(daItem);
if (!clearDict.ContainsKey(key))
clearDict.Add(key, daItem);
}
元素数量: 750,000
时间: 0.23秒!