C# LINQ -循环遍历列表

ddrv8njm  于 2022-12-06  发布在  C#
关注(0)|答案(4)|浏览(227)

我有一个测试LINQ列表如下

List<test> test=new List<test>();
test.Add(new test("Bakery","bakery@store.com","Donut"));
test.Add(new test("Bakery","bakery@store.com","Bagel"));
test.Add(new test("Bakery","bakery@store.com","Cake"));
test.Add(new test("Produce","produce@store.com","Apple"));
test.Add(new test("Dairy","dairy@store.com","Milk"));
test.Add(new test("Dairy","dairy@store.com","Yogurt"));

某些部门有多个项目。如何循环列表并向每个部门/电子邮件地址发送1封包含项目的电子邮件。向www.example.com发送1bakery@store.com包含Donut、Bagel、Cake的电子邮件。向www.example.com发送1produce@store.com正文包含Apple的电子邮件。向www.example.com发送1dairy@store.com包含Milk、Yogurt的电子邮件
我不需要帮助的电子邮件部分,只是需要帮助循环通过列表,并获得每个部门的项目。非常感谢!!!

ua4mk5z4

ua4mk5z41#

我想,你可能会用分组来完成任务。

var groups = test.GroupBy(x => x.Email);
foreach (var group in groups)
{
  var email = group.Key; // Exactly the property from GroupBy
  var goods = group.Select(x => x.Good); // Donut, Bagel, Cake...
  var body = string.Join(", ", goods);

  // Now you can send the email with body containing "Donut, Bagel. Cake"
}

group变数的每个执行严修都包含Key属性和test集合中群组项目的集合。
因此,可以将groupSelect之类的方法或foreach运算符一起使用。

kzipqqlq

kzipqqlq2#

List<test> test=new List<test>();
test.Add(new test("Bakery","bakery@store.com","Donut"));
test.Add(new test("Bakery","bakery@store.com","Bagel"));
test.Add(new test("Bakery","bakery@store.com","Cake"));
test.Add(new test("Produce","produce@store.com","Apple"));
test.Add(new test("Dairy","dairy@store.com","Milk"));
test.Add(new test("Dairy","dairy@store.com","Yogurt"));

foreach (var group in test.GroupBy(x=> x.Department))
{
    var department = group.Key;
    var email = group.First().Email;
    var body = string.Join(", ", group.Select(x => x.Product));

    SendMail(email, department, body);
}
oknwwptz

oknwwptz3#

如果要 * 分组 *(项目),让我们使用GroupBy(按DepartmentAddress)。首先,让我们准备数据:

var emails = test
  .GroupBy(item => (department : item.Department, address : item.Address),
           item => item.Item)
  .Select(group => (department : group.Key.department,
                    address    : group.Key.address,
                    body       : string.Join(", ", group.Distinct().OrderBy(item => item))));

然后我们就可以发送邮件了:

foreach (var letter in emails)
  SendEmail(letter.address, letter.deparment, letter.body);
niknxzdl

niknxzdl4#

您确定部门为Bakery的所有tests都有相同的电子邮件地址吗?或者可能是(例如,由于键入错误)某些Bakeries有不同的电子邮件地址?
如果所有Bakeries都有相同的地址,那么您可以使用Enumerable.GroupBy的重载之一来创建具有相同部门的测试组。然后,对于每个组,获取该组中第一个测试的电子邮件(或者任何其他测试,反正它们都是相同的)。使用带有参数resultselector的重载来指定您的结果

class Test
{
    public string Department {get; set;}
    public string EmailAddress {get; set;}
    ... // other properties
}

IEnumerable<Test> myTests = ...

var departmentsEmailAddresses = myTests.GroupBy(

    // make groups of test that have the same value for Department
    test => test.Department,

    // parameter resultSelector: for every Department name and all Tests that have
    // this value for Department name, make one new object:
    (department, testsWithThisValueForDepartment) => new
    {
        // if desired: remember the department name
        Department = department,

        // to get the e-mail address, take the first test.
        // BTW: all tests in this group will have the same e-mail address
        Email = testsWithThisValueForDepartment.Select(test => test.EmailAddress)
                                               .FirstOrDefault(),
    })

换句话说:对于所有的测试,将属性Department的值相同的测试分组。每组中至少有一个测试。从每组中,取该组中所有测试将具有的Department的公共值。此外,取该组中的测试,并选择EmailAddress的值。仅对组中的第一个测试执行此操作。
结果将是[Department, Email]的组合序列

相关问题