假設我們有乙個類:product
public
class product
public
string name
}
main函式如下:
static
void main()
, new product(),
new product(),
new product(),
};var distinctproduct = products.distinct();
console.readline();
}
可以看到distinctproduct 的結果是:
因為distinct 預設比較的是product物件的引用,所以返回4條資料。
那麼如果我們希望返回id唯一的product,那麼該如何做呢?
distinct方法還有另乙個過載:
//通過使用指定的 system.collections.generic.iequalitycomparer對值進行比較
//返回序列中的非重複元素。
public
static ienumerabledistinct(this ienumerablesource,
iequalitycomparercomparer);
該過載接收乙個iequalitycomparer的引數。
假設要按id來篩選,那麼應該新建類productidcomparer內容如下:
public
class productidcomparer : iequalitycomparer
public
int gethashcode(product obj)
}
使用的時候,只需要
var distinctproduct = products.distinct(new productidcomparer());
結果如下:
現在假設我們要 按照 name來篩選重複呢?
很明顯,需要再新增乙個類productnamecomparer.
那能不能使用泛型類呢??
新建類propertycomparer繼承iequalitycomparer內容如下:
public
class propertycomparer: iequalitycomparer is not a property of type .",
propertyname, typeof(t)));}}
#region iequalitycomparermembers
public
bool equals(t x, t y)
public
int gethashcode(t obj)
#endregion
}
主要是重寫的equals 和gethashcode 使用了屬性的值比較。
使用的時候,只需要:
//var distinctproduct = products.distinct(new propertycomparer("id"));
var distinctproduct = products.distinct(new propertycomparer("name"));
結果如下:
為什麼微軟不提供propertyequality這個類呢?
按照上面的邏輯,這個類應該沒有很複雜啊,細心的同學可以發現propertyequality 大量的使用了反射。每次獲取屬性的值的時候,都在呼叫
_propertyinfo.getvalue(x, null);
可想而知,如果要篩選的記錄非常多的話,那麼效能無疑會受到影響。
為了提公升效能,可以使用表示式樹將反射呼叫改為委託呼叫,
具體**如下:
public
class fastpropertycomparer: iequalitycomparer is not a property of type .",
propertyname, typeof(t)));
}parameterexpression exppara = expression.parameter(typeof(t), "obj");
memberexpression me = expression.property(exppara, _propertyinfo);
getpropertyvaluefunc = expression.lambdaobject>>(me, exppara).compile();
}#region iequalitycomparermembers
public
bool equals(t x, t y)
public
int gethashcode(t obj)
#endregion
}
可以看到現在獲取值只需要getpropertyvaluefunc(obj)就可以了。
使用的時候:
var distinctproduct = products.distinct(new fastpropertycomparer("id")).tolist();
lovejenny
出處:
Linq 中 Distinct 的運用
person1 id 1,name test1 person2 id 1,name test1 person3 id 2,name test2 以上list如果直接使用distinct方法進行過濾,仍然返回3條資料,而需要的結果是2條資料。下面給出解這個問題的方法 方法1 distinct 方法中使...
如何很好的使用Linq的Distinct方法
person1 id 1,name test1 person2 id 1,name test1 person3 id 2,name test2 以上list如果直接使用distinct方法進行過濾,仍然返回3條資料,而需要的結果是2條資料。下面給出解這個問題的方法 方法1 distinct 方法中使...
關於對Linq的Distinct的擴充套件
今天偶然看到一篇文章,是對linq的distinct的擴充套件 看這裡 其中方法2比較簡潔 public static ienumerabledistinctby this ienumerablesource,funckeyselector 呼叫示例 使用方法如下 針對id,和name進行disti...