我知道如何以丑陋的方式做到这一点,但我想知道是否有更优雅和简洁的方法.
我有一个字符串数组的电子邮件地址.假设字符串数组具有任意长度 - 它可能有几个项目,或者它可能有很多项目.我想构建另一个字符串,包括来自字符串数组的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)
| 归档时间: |
|
| 查看次数: |
10450 次 |
| 最近记录: |