C#:将字符串数组分成N个实例的最简洁方法N个项目长
我知道如何以丑陋的方式做到这一点,但我想知道是否有更优雅和简洁的方法。
我有一个字符串数组的电子邮件地址。 假设字符串数组具有任意长度 – 它可能包含一些项目,或者它可能包含很多项目。 我想构建另一个字符串,包括来自字符串数组的50个电子邮件地址,直到数组的末尾,并在每个50之后使用Send()方法中的50个地址的字符串调用发送操作。
更普遍的问题是,做这种事情的最干净/最清晰的方法是什么。 我有一个解决方案,这是我的VBScript学习的遗产,但我打赌在C#中有更好的方法。
你想要优雅和简洁,我会给你优雅和简洁:
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());
当你不需要时,为什么要乱用所有那些糟糕的循环代码? 你想把五十年代的东西分组 , 然后把它们分组五十年代。 这就是集团运营商的目标!
更新:评论者MoreCoffee询问这是如何工作的。 让我们假设我们想要按三分组,因为这更容易输入。
var threes = from index in Enumerable.Range(0, addresses.Length) group addresses[index] by index/3;
我们假设有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
循环执行之前不执行操作。
似乎与此问题类似: 使用LINQ将集合拆分为n个部分?
Hasan Khan在那里的答案的修改版应该可以解决问题:
public static IEnumerable> Chunk( this IEnumerable list, int chunkSize) { int i = 0; var chunks = from name in list group name by i++ / chunkSize into part select part.AsEnumerable(); return chunks; }
用法示例:
var addresses = new[] { "a@example.com", "b@example.org", ...... }; foreach (var chunk in Chunk(addresses, 50)) { SendEmail(chunk.ToArray(), "Buy V14gr4"); }
听起来输入包含大型数组中的单独电子邮件地址字符串,而不是一个字符串中的多个电子邮件地址,对吧? 在输出中,每个批次都是单个组合字符串。
string[] allAddresses = GetLongArrayOfAddresses(); const int batchSize = 50; for (int n = 0; n < allAddresses.Length; n += batchSize) { string batch = string.Join(";", allAddresses, n, Math.Min(batchSize, allAddresses.Length - n)); // use batch somehow }
假设您使用的是.NET 3.5和C#3,那么这样的事情应该很好用:
string[] s = new string[] {"1", "2", "3", "4"....}; for (int i = 0; i < s.Count(); i = i + 50) { string s = string.Join(";", s.Skip(i).Take(50).ToArray()); DoSomething(s); }
我只是循环遍历数组并使用StringBuilder创建列表(我假设它是分开的;就像你对电子邮件一样)。 只需在你点击mod 50或结束时发送。
void Foo(string[] addresses) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < addresses.Length; i++) { sb.Append(addresses[i]); if ((i + 1) % 50 == 0 || i == addresses.Length - 1) { Send(sb.ToString()); sb = new StringBuilder(); } else { sb.Append("; "); } } } void Send(string addresses) { }
我认为我们需要更多关于这个列表究竟是什么样的内容来给出明确的答案。 现在我假设这是一个分号列出的电子邮件地址列表。 如果是这样,您可以执行以下操作以获取分块列表。
public IEnumerable DivideEmailList(string list) { var last = 0; var cur = list.IndexOf(';'); while ( cur >= 0 ) { yield return list.SubString(last, cur-last); last = cur + 1; cur = list.IndexOf(';', last); } } public IEnumerable> ChunkEmails(string list) { using ( var e = DivideEmailList(list).GetEnumerator() ) { var list = new List (); while ( e.MoveNext() ) { list.Add(e.Current); if ( list.Count == 50 ) { yield return list; list = new List (); } } if ( list.Count != 0 ) { yield return list; } } }
我认为这很简单,也很快。下面的例子将长句子分成15个部分,但是你可以将批量大小作为参数传递给动态。这里我只是用“/ n”来划分。
private static string Concatenated(string longsentence) { const int batchSize = 15; string concatanated = ""; int chanks = longsentence.Length / batchSize; int currentIndex = 0; while (chanks > 0) { var sub = longsentence.Substring(currentIndex, batchSize); concatanated += sub + "/n"; chanks -= 1; currentIndex += batchSize; } if (currentIndex < longsentence.Length) { int start = currentIndex; var finalsub = longsentence.Substring(start); concatanated += finalsub; } return concatanated; }
这显示了拆分操作的结果。
var parts = Concatenated(longsentence).Split(new string[] { "/n" }, StringSplitOptions.None);
基于Eric答案的扩展方法:
上述就是C#学习教程:C#:将字符串数组分成N个实例的最简洁方法N个项目长分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
public static IEnumerable> SplitIntoChunks(this T[] source, int chunkSize) { var chunks = from index in Enumerable.Range(0, source.Length) group source[index] by index / chunkSize; return chunks; } public static T[][] SplitIntoArrayChunks (this T[] source, int chunkSize) { var chunks = from index in Enumerable.Range(0, source.Length) group source[index] by index / chunkSize; return chunks.Select(e => e.ToArray()).ToArray(); }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1006659.html