我在删除列表中的重复引用时遇到问题.
我有这个清单
List<SaveMongo> toReturn
Run Code Online (Sandbox Code Playgroud)
我的班级SaveMongo看起来像这样
public class SaveMongo
{
public ObjectId _id { get; set; }
public DateTime date { get; set; }
public Guid ClientId { get; set; }
public List<TypeOfSave> ListType = new List<TypeOfSave>();
public List<ObjectId> ListObjSave = new List<ObjectId>();
public SaveMongo()
{ }
}
Run Code Online (Sandbox Code Playgroud)
每当我想在列表中添加元素时,我都使用以下代码
public static fctName(BsonDocument doc)
{
toReturn.Add(AddingSaveMongo(doc.GetValue("_id")));
}
public static SaveMongo AddingSaveMongo(BsonValue ObjValue)
{
foreach (SaveMongo doc in SpeCollection.FindAll())
{
foreach (var id in doc.ListObjSave)
{
if (id == ObjValue)
return (doc);
}
}
return (null);
}
Run Code Online (Sandbox Code Playgroud)
但是,我有时会得到重复的引用.我试过用这个
toReturn = toReturn.Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)
删除它们.没有成功.
我也试过这样做
if (!toReturn.Contains(AddingSaveMongo(doc.GetValue("_id"))))
toReturn.Add(AddingSaveMongo(doc.GetValue("_id")));
Run Code Online (Sandbox Code Playgroud)
仍然没有成功.但每当我在列表中打印引用时,我都会得到这些结果


我在这里缺少什么,以便我的列表中仍然有重复参考?
目前,Distinct正在使用匹配您的对象object.Equals,这是做参考相等.告诉它根据其他标准匹配对象的一种方法是实现IEquatable<SaveMongo>.此示例基于以下对象比较对象Id:
public class SaveMongo : IEquatable<SaveMongo>
{
public ObjectId _id { get; set; }
public DateTime date { get; set; }
public Guid ClientId { get; set; }
public List<TypeOfSave> ListType = new List<TypeOfSave>();
public List<ObjectId> ListObjSave = new List<ObjectId>();
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((SaveMongo) obj);
}
public override int GetHashCode()
{
return _id.GetHashCode();
}
public bool Equals(SaveMongo other)
{
return _id.Equals(other._id);
}
}
Run Code Online (Sandbox Code Playgroud)
使用分组:
toReturn = (from e in toReturn
group e by e._id into g
select g.First()).ToList();
Run Code Online (Sandbox Code Playgroud)
此外,您可以按两个(或更多)字段进行分组:
toReturn = (from e in toReturn
// group by ID and Date component
group e by new { e._id, e.date.Date } into g
select g.First()).ToList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |