![](/img/trans.png)
[英]Using a IEqualityComparer for Anoymous Type in a LINQ GroupBy function
[英]GroupBy with predefined type using Linq
我正在追蹤數據
Id1 Id2 Days
------------------------
1 1 10
1 1 20
1 2 30
1 3 40
我想使用Linq按Id1
和Id2
對數據進行分組當按以下方式進行分組時,它給我正確的結果
List<data>.GroupBy(p => new {p.Id1, p.Id2});
但是,當我使用預定義類型時,它給我的結果是四個不同的行組。 它不會將前兩行合並到一個組中。
List<data>.GroupBy(p => new GroupKey(p.Id1, p.Id2));
class GroupKey
{
public GroupKey(decimal _id1,decimal _id2)
{
Id1= _id1;
Id2= _id2;
}
public decimal Id1{ get; set; }
public decimal Id2{ get; set; }
}
如何使用預定義類型獲得相同的結果?
為類型實現Equals
和GetHashCode
。
就像是:
public override bool Equals(object other)
{
var otherKey = other as GroupKey;
if (otherKey == null)
{
return false;
}
return otherKey.Id1 == this.Id1 && otherKey.Id2 == this.Id2;
}
public override int GetHashCode()
{
return this.Id1.GetHashCode() ^ this.Id2.GetHashCode();
}
之所以適用於匿名類型(例如您在第一個示例中創建的類型),是因為匿名類型會自動獲得Equals
和GetHashCode
的實現,這些實現是根據匿名類型上定義的屬性定義的(請參見“備注”部分)在MSDN上的“ 匿名類型 ”文章中)。
使用struct
而不是class
並使其不可變。
struct GroupKey
{
public GroupKey(decimal _id1,decimal _id2):this()
{
Id1= _id1;
Id2= _id2;
}
public decimal Id1{ get; private set; }
public decimal Id2{ get; private set; }
}
首先,它將比類占用更少的內存。 第二,默認的結構相等行為比較結構的內容而不是引用。 這就是為什么它不能正確分組的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.