C# 使用lambda表达式选择对象数组中变量的所有不同值

C# 使用lambda表达式选择对象数组中变量的所有不同值,c#,lambda,C#,Lambda,我有一个属性为ProductId的对象数组。我想使用lambda表达式来选择对象数组产品中ProductId的所有不同值 这是我的产品 var products = Database.SqlQuery<StructuredProduct>("query").ToArray(); 关于如何在products数组中使用Lambda表达式来获取productid的所有不同值,您有什么想法吗 var productIds= products.Select(p => p.Product

我有一个属性为
ProductId
的对象数组。我想使用lambda表达式来选择对象数组
产品
ProductId
的所有不同值

这是我的产品

var products = Database.SqlQuery<StructuredProduct>("query").ToArray();
关于如何在
products
数组中使用Lambda表达式来获取
productid
的所有不同值,您有什么想法吗

var productIds= products.Select(p => p.ProductId).Distict();
但直接在数据库上执行此操作可能更好,因为它是
“query”
sql命令的一部分

使用LINQ方法


我只使用查询理解语法执行过GroupBy操作。如果您这样做,
/
/
分组到
,则分组到的对象具有一个名为
的属性。将包含您的“productid”`

var results = from product in products
    group product by ProductId
    into individualProducts
    select individualProducts;

var productsArray = individualProducts.Select(p => p.Key).ToArray();
项目
individualProducts
集合每个项目都有一个
和一个具有相同productid的物品集合


如果直接从数据库中执行此操作,那么所有操作都将很好地组合到一个SQL语句中,在代码到达
.ToArray()

时执行该语句。这看起来有点可怕,就像
数据库一样。SqlQuery()
方法将迫使您编写极易受SQL注入问题影响的代码。我希望有一种机制可以接受与sql命令字符串分离的查询参数数据。17秒:)。@JoelCoehoorn我使用优化编译:on:Dvar productIds=products.GroupBy(p=>p.ProductId)。Select(group=>group.First()).Select(p=>p.ProductId.ToArray();也会起作用。但是上面的解决方案更好这工作很完美谢谢!我在最后添加了一个.ToArray(),这正是我所需要的。不幸的是,由于其他一些限制,我不能将其包含在
“query”
sql命令中。@LRID添加.ToArray()通常是个坏主意。相反,将变量定义为IEnumerable@JoelCoehoorn永远不要使用
ToArray()
是一个更糟糕的主意,因为如果知道惰性序列将被完全枚举,就不应该让它们被分配。其结果是重复地重新评估您的收集,并冒着副作用的风险(我在使用LINQ生成类实例时意外地创建了访问计数器),从而将事情保持在垃圾收集器的范围内。像
Sort()
Distinct()
这样的操作通常强制进行完全求值,因为如果不完全扫描集合1中的值,您如何知道该值是否不在集合2中?
var productIds = products.Select(p => p.ProductId).Distinct();
var results = from product in products
    group product by ProductId
    into individualProducts
    select individualProducts;

var productsArray = individualProducts.Select(p => p.Key).ToArray();