Linq的Distinct太不給力了

2021-09-08 21:43:33 字數 3150 閱讀 4506

假設我們有乙個類: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...