C#:将字符串数组分成N个实例的最简洁方法N个项目长

21 c# arrays string loops

我知道如何以丑陋的方式做到这一点,但我想知道是否有更优雅和简洁的方法.

我有一个字符串数组的电子邮件地址.假设字符串数组具有任意长度 - 它可能有几个项目,或者它可能有很多项目.我想构建另一个字符串,包括来自字符串数组的50个电子邮件地址,直到数组的末尾,并在每个50之后使用Send()方法中的50个地址的字符串调用发送操作.

更普遍的问题是做这种事情的最干净/最清晰的方法是什么.我有一个解决方案,这是我的VBScript学习的遗产,但我认为在C#中有更好的方法.

Eri*_*ert 49

你想要优雅和简洁,我会给你优雅和简洁:

var fifties = from index in Enumerable.Range(0, addresses.Length) 
              group addresses[index] by index/50;
foreach(var fifty in fifties)
    Send(string.Join(";", fifty.ToArray());
Run Code Online (Sandbox Code Playgroud)

当你不需要时,为什么要乱用所有可怕的循环代码?你想把五十年代的东西分组,然后把它们分组五十年代. 这就是集团运营商的目标!

更新:评论者MoreCoffee询问这是如何工作的.我们假设我们想要按三分组,因为这更容易输入.

var threes = from index in Enumerable.Range(0, addresses.Length) 
              group addresses[index] by index/3;
Run Code Online (Sandbox Code Playgroud)

假设有9个地址,索引为0到8

这个查询是什么意思?

Enumerable.Range是从零开始的九个数字的范围,所以0, 1, 2, 3, 4, 5, 6, 7, 8.

范围变量index依次采用这些值中的每一个.

然后我们检查每个对应的addresses[index]并将其分配给一个组.

我们将它分配给哪个组?分组index/3.整数运算在C#中向零舍入,因此当除以3时,索引0,1和2变为0.当除以3时,索引3,4,5变为1.索引6,7,8变为2.

所以我们分配addresses[0],addresses[1]addresses[2]于组0, addresses[3],addresses[4]addresses[5]组1,依此类推.

查询的结果是三个组的序列,每个组是三个项目的序列.

那有意义吗?

还要记住,查询表达式的结果是表示此操作查询.它在循环执行之前不执行操作foreach.


dtb*_*dtb 14

似乎与此问题类似:使用LINQ将集合拆分为n个部分?

Hasan Khan在那里的答案的修改版应该可以解决问题:

public static IEnumerable<IEnumerable<T>> Chunk<T>(
    this IEnumerable<T> list, int chunkSize)
{
    int i = 0;
    var chunks = from name in list
                 group name by i++ / chunkSize into part
                 select part.AsEnumerable();
    return chunks;
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

var addresses = new[] { "a@example.com", "b@example.org", ...... };

foreach (var chunk in Chunk(addresses, 50))
{
    SendEmail(chunk.ToArray(), "Buy V14gr4");
}
Run Code Online (Sandbox Code Playgroud)