gpt4 book ai didi

c# - Linq to 对象和 lambda 表达式

转载 作者:太空宇宙 更新时间:2023-11-03 20:53:04 24 4
gpt4 key购买 nike

有 Client 类和 Commande 类:

public class Client {
public int Identifiant { get; set; }
public string Nom { get; set; }
public int Age { get; set; }
}

public class Commande
{
public int Identifiant {get; set;}
public int IdentifiantClient {get;set;}
public decimal Prix {get;set;}
}

下面是一些基于这些类的列表:

List<Client> listeClients = new List<Client>
{ new Client{Identifiant=1,Nom="Nicolas",Age=30},
new Client{ Identifiant = 2, Nom = "Jérémie", Age = 20},
new Client{ Identifiant=3, Nom="Delphine", Age=30},
new Client{Identifiant = 4, Nom = "Bob", Age = 10}
};

List<Commande> listeCommandes = new List <Commande>
{
new Commande{Identifiant=1, IdentifiantClient=1, Prix = 150.05M},
new Commande{Identifiant=2, IdentifiantClient= 2, Prix= 30M},
new Commande{Identifiant= 3, IdentifiantClient= 1, Prix= 99.99M},
new Commande{Identifiant= 4, IdentifiantClient= 1, Prix= 100M},
new Commande{Identifiant= 5, IdentifiantClient = 3, Prix = 80M},
new Commande{Identifiant = 6, IdentifiantClient = 3,Prix = 10M}
};

现在有这个 Linq 表达式:

var liste = from commande in listeCommandes
join
client in listeClients on commande.IdentifiantClient equals client.Identifiant
group commande by new {commande.IdentifiantClient, client.Nom}
into commandesGroupees
let total = commandesGroupees.Sum(c => c.Prix)
where total > 50
orderby total
select new {
commandesGroupees.Key.IdentifiantClient,
commandesGroupees.Key.Nom,
NombreDeCommandes = commandesGroupees.Count(),
PrixTotal = total
};

foreach(var element in liste)
{
Console.WriteLine("Le client {0} ({1}) a réalisé {2} commande(s) pour un total de {3}", element.Nom, element.IdentifiantClient, element.NombreDeCommandes, element.PrixTotal);
}

在 Linq 表达式中有这个表达式:let total = commandesGroupees.Sum(c => c.Prix)。参数 c 怎么可能表示 Command 类的实例化?因为有属性 Prix 的调用!

最佳答案

让我们一点一点地分析这个查询表达式。

from commande in listeCommandes

很明显如果listeCommandesList<Commande> , commande应该是 Commande 类型.对吧?

join
client in listeClients on commande.IdentifiantClient equals client.Identifiant

此连接将客户端列表连接到查询。现在我们有一个 client Client 类型的变量.但这与commande没有太大关系。 , 仍然是 Commande 类型.

group commande by new {commande.IdentifiantClient, client.Nom}
into commandesGroupees

这就是它变得有趣的地方。当你加群commande , 一堆 IGrouping<AnonymousClass, Commande>被创建。这正是 commandesGroupees在这里。

那么如果你调用 Sum 会发生什么?在 IGrouping<AnonymousClass, Commande> 上?请记住 SumIEnumerable<T> 上的扩展方法, 和 IGrouping<AnonymousClass, Commande>工具 IEnumerable<Commandes> .这意味着您基本上是在调用 SumIEnumerable<Commandes> 上,它需要一个 Function<Commande, decimal> .

关于c# - Linq to 对象和 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53274956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com