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();
}
}
为什么不尝试Distinct()方法可能会编写
List.Distinct();
GetHashCode函数可能会减慢速度。哈希代码用于平衡哈希表,为了获得最佳性能,哈希函数必须为所有输入生成随机分布。你应该试试:
public int GetHashCode(myClass obj)
{
return obj.SomeData.First ^ obj.SomeData.Second;
}
您可以使用System.Diagnostics.Stopwatch测试性能,并循环100000到1000000次。