c# - 如何使用简单的 linq 获得不同的多列?
问题描述
我有一个产品列表,例如:
List<Product> products = new List<Product>();
products.Add( new Product{ ProductID=1,Category="Food",SubCategory="Snacks",Location="Tokyo"});
products.Add( new Product{ ProductID=1,Category="Food",SubCategory="Snacks",Location="Tokyo"});
products.Add( new Product{ ProductID=1,Category="Food",SubCategory="Snacks",Location="Tokyo"});
我需要一个简单的查询来查找产品的不同记录。我正在做类似的事情:
products.Select(x=>x.ProductID||x=>x.Category||x=>x.SubCategory).Distinct().ToList();
解决方案
Distinct
运算符有一个重载,它需要一个,IEqualityComparer<T>
因此您可以更改Product
以实现它:
class Product : IEqualityComparer<Product>
{
public int ProductID { get; internal set; }
public string Category { get; internal set; }
public string SubCategory { get; internal set; }
public string Location { get; internal set; }
public bool Equals(Product x, Product y)
{
return
x.Category.Equals(y.Category) &&
x.Location.Equals(y.Location) &&
x.SubCategory.Equals(y.SubCategory);
}
public int GetHashCode(Product obj)
{
return ProductID;
}
}
然后您的查询可以像这样工作:
var distinctProducts =
(from product in products
select product)
.Distinct(new Product())
.ToList();
请注意,我传递了一个 的实例Product
,它实现IEqualityComparer<Product>
了Distinct
。
推荐阅读
- machine-learning - MeanShift 估计器的无分数方法 - scikit-learn
- javascript - Video.js 黑屏仅在高度超过 225 像素时播放音频
- enums - Elixir 移除嵌套元素
- git - 我可以帮助解决一个小写的 Git 幻像目录吗?
- java - 使用 java final 关键字时出错,无法修改 final ArrayList 的副本
- python - 如何比较持有 numpy.ndarray 的数据类的相等性(bool(a==b)引发 ValueError)?
- javascript - ES5 和 ES6 的导入区别
- c# - 如何禁用 Webbrowser 控件上的弹出窗口并将 Webbrowser 导航到新 url?
- java - java中的文件锁定
- php - 复制 vs Curl 将外部文件保存在我的服务器上