C#:与包含列表的区别

本文关键字:区别 列表 包含 | 更新日期: 2023-09-27 18:25:28

我有一个类的实例列表。每个实例都包含一个IList属性和一个自定义类的对象。现在,我想删除该列表中的所有distict实例,其中包含的IList属性和MyMulti类的Multi-Property的元素相等。我只想保留列表中的一个元素;第一个"-";someData"-房地产价格最低。我的建议是,通过包含的IList属性和";多"-";SomeData"-属性,然后按";第一个"-";SomeData"-属性,然后选择每个组的第一个元素。

我需要它尽可能的表演。有什么想法吗?

示例:

class myClass
{
    public IList<String> SomeStrings { get; set; }
    public MyMulti SomeData { get; set; }
    public myClass(MyMulti data, params string[] strings)
    {
        SomeData = data;
        SomeStrings = strings;
    }
}
class MyMulti
{
    public int First { get; set; }
    public int Second { get; set; }
    public int Multi
    {
        get
        {
            return First * Second;
        }
    }
    public MyMulti(int first, int second)
    {
        First = first;
        Second = second;
    }
}
var mc1 = new myClass(new MyMulti(6, 4), "0", "1");
var mc2 = new myClass(new MyMulti(3, 8), "0", "1");
var mc3 = new myClass(new MyMulti(7, 3), "0", "1");
var mc4 = new myClass(new MyMulti(2, 35), "0", "2");
var mc5 = new myClass(new MyMulti(5, 4), "1", "1");
var mc6 = new myClass(new MyMulti(7, 10), "0", "2");
IList<myClass> aList = new List<myClass>(){mc1, mc2, mc3, mc4, mc5, mc6};
var query = aList.GroupBy(x =>
    new
    {
        x.SomeData.Multi,
        x.SomeStrings   
        // don't work cause this will compare the lists 
        // not the containing elements
    })
    .Select(x=>
        x.OrderBy(y=>
            y.SomeData.First)
            .First());

结果应该是:mc1和mc2分组然后丢弃mc1,mc3自己的组,mc4和mc6分组然后丢弃mc6,mc5自己的组-->mc2、mc3、mc4、mc5应保持

编辑:

如果我首先根据MyClass.SomeData.first属性对List进行排序,然后使用List.Dispinct()-方法和我得到的自定义IEqalityComparer实现,我正在搜索什么。但这是最具表演性的方式吗?

public class myClassEqualityComparer : IEqualityComparer<myClass>
{
    public bool Equals(myClass x, myClass y)
    {
        if (!x.SomeData.Multi.Equals(y.SomeData.Multi))
            return false;
        else
            if (x.SomeStrings.AsEnumerable()
                   .SequenceEqual(y.SomeStrings.AsEnumerable()))
                return true;
        return false;
    }
    public int GetHashCode(myClass obj)
    {
        int hCode = obj.SomeData.Multi;
        foreach (var item in obj.SomeStrings)
        {
            hCode = hCode ^ item.GetHashCode();
        }
        return hCode.GetHashCode();
    }
}

C#:与包含列表的区别

为什么不尝试Distinct()方法可能会编写

List.Distinct();

GetHashCode函数可能会减慢速度。哈希代码用于平衡哈希表,为了获得最佳性能,哈希函数必须为所有输入生成随机分布。你应该试试:

public int GetHashCode(myClass obj)
{
    return obj.SomeData.First ^ obj.SomeData.Second;
}

您可以使用System.Diagnostics.Stopwatch测试性能,并循环100000到1000000次。