如何从对象列表中获得特定的对象集

本文关键字:对象 列表 | 更新日期: 2023-09-27 18:10:58

List<objects> MyObjects = GetobjectsfromList(otherlist);

我正在使用的MyObjects列表有多个属性

String name;
String locationInfo;
String otherObjectName;
DateTime date1;
DateTime date2;

(等等)

包含在MyObjects中是这样的:

Obj1 (name1, location1, otherobjectname1, date1, date2)
Obj2 (name2, location2, otherobjectname1, date4, date7)
Obj3 (name3, location3, otherobjectname1, date6, date9)
Obj4 (name4, location6, otherobjectname2, date1, date2)
Obj5 (name5, location7, otherobjectname2, date1, date2)

(对于总共约2600条记录,这些属性使每个记录唯一)

基本上所有的ObJ对象都至少有一个属性,使它们在集合中是唯一的。因此,使用任何groupby、distinct或任何其他linq .where子句,我尝试过的,总是能得到整个集合,因为每个记录都是真正唯一的。

我需要的是从这个对象的整体集合中获得每个对象中的一个,用于对象上的一个独特属性…即otherobjectname。看看一个有3条记录,另一个有2条记录(我已经从这些otherobjectname中创建了一个哈希集,只有975条记录)。

我需要从这个集合中得到的只是一个新的MyObjects集合,其中我只有一个otherobjectname,我不关心它是哪个记录。

返回新列表,其中包含以下内容:

Obj1 (name1, location1, otherobjectname1, date1, date2) (I do not care which of the 3)
Obj4 (name4, location6, otherobjectname2, date1, date2) (I do not care which of the 2)

对于集合

中每个唯一的otherobjectname以此类推

对象上的一个属性只有一个唯一记录有什么办法可以做到吗?对不起,我不能真正发布示例代码,我试图写出最好的我可以不使用任何特定的安全规则。

如何从对象列表中获得特定的对象集

您可以使用DistinctBy方法(它不是标准的Linq方法,但您可以在MoreLinq或Linq. extras中找到它的实现)。

var distinct = MyObjects.DistinctBy(x => w.OtherObjectName);

或者如果你喜欢,你可以创建一个自定义的相等比较器,只比较OtherObjectName属性,并将其传递给Distinct:

class MyObjectComparerByOtherObjectName : IEqualityComparer<MyObject>
{
    public bool Equals(MyObject x, MyObject y)
    {
        return x.OtherObjectName == y.OtherObjectName;
    }
    public bool GetHashCode(MyObject x)
    {
        return x.OtherObjectName != null ? x.OtherObjectName.GetHashCode() : 0;
    }
}
...
var distinct = MyObjects.Distinct(new MyObjectComparerByOtherObjectName());

您可以通过otherObjectName创建一个组,并从组中选择第一个,如下所示:

static void Main(string[] args)
{
    List<MyObject> objects = new List<MyObject> {
        new MyObject { name = "name1", locationInfo = "location1", otherObjectName = "otherobjectname1" },
        new MyObject { name = "name2", locationInfo = "location2", otherObjectName = "otherobjectname1" },
        new MyObject { name = "name3", locationInfo = "location3", otherObjectName = "otherobjectname1" },
        new MyObject { name = "name4", locationInfo = "location6", otherObjectName = "otherobjectname2" },
        new MyObject { name = "name5", locationInfo = "location7", otherObjectName = "otherobjectname2" },
    };
    var query = objects.GroupBy(o => o.otherObjectName)
        .Select(g => g.First());
    foreach(var o in query)
        Console.WriteLine("{0} {1}", o.name,  o.otherObjectName);
}

这回报:

name1 otherobjectname1
name4 otherobjectname2