使用linq在c#中将每一行作为一组
我有一个包含1000行的字符串数组,如何使用linq c#将每25行分成一个文本。 我可以使用循环,但我需要使用linq的代码使用linq在c#中将每一行作为一组,c#,linq,take,C#,Linq,Take,我有一个包含1000行的字符串数组,如何使用linq c#将每25行分成一个文本。 我可以使用循环,但我需要使用linq的代码 var blocks = File.ReadLines(filename) .Select((s, i) => new { s, i }) .GroupBy(x => x.i / 25) .Select(g => String.Joi
var blocks = File.ReadLines(filename)
.Select((s, i) => new { s, i })
.GroupBy(x => x.i / 25)
.Select(g => String.Join(" ", g.Select(x => x.s)))
.ToList();
您还可以使用Morelinq的批处理方法:因为您在问题中标记了
take
,下面介绍如何使用take()
从Linq
获得与@EZI相同的结果
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
List<string> _1000Lines = new List<string>();
for (int i = 1; i <= 1000; i++)
_1000Lines.Add(i.ToString());
for (int i = 0; i < _1000Lines.Count; i += 25)
{
// Use Skip() to skip the previous 25 items from the previous iteration
Console.WriteLine(String.Join(" ", _1000Lines.Skip(i).Take(25)));
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
公共课程
{
公共静态void Main()
{
列表_1000行=新列表();
对于(inti=1;i当问题是关于一个简单的linq时,我认为答案应该是美观且性能良好的。因此,我准备了一个测试用例
由于这是一个社区wiki,请随时更新
var arr = Enumerable.Range(0, 20000).Select(x => x.ToString()).ToArray();
var t1 = Measure(() =>
{
var blocks = arr
.Select((s, i) => new { s, i })
.GroupBy(x => x.i / 25)
.Select(g => String.Join(" ", g.Select(x => x.s)))
.ToList();
}, 1000);
var t2 = Measure(() =>
{
var allLines = new List<string>();
for (int i = 0; i < arr.Length; i += 25)
{
allLines.Add(String.Join(" ", arr.Skip(i).Take(25)));
}
}, 1000);
var t3 = Measure(() =>
{
int count = 0;
var blocks = arr
.GroupBy(x => count++ / 25)
.Select(g => String.Join(" ", g))
.ToList();
}, 1000);
var t4 = Measure(() =>
{
var blocks = arr.Batch(25, x => x)
.Select(g => String.Join(" ", g))
.ToList();
}, 1000);
Console.WriteLine("EZI: {0}\nShar1er80: {1}\nModified-EZI: {2}\nMoreLinq'sBatch: {3}", t1,t2,t3,t4);
到目前为止,您尝试了什么?我只使用了for loop@أححملححة,然后用数组替换File.ReadLines(filename)
。仅此而已。(两者都是IEnumerable
)我认为解释分组是由字符串索引的整个部分(在可枚举中)完成的是有用的到25。前25个将有0,下25个将有1,以此类推。
long Measure(Action action, int n)
{
action();
var sw = Stopwatch.StartNew();
for (int i = 0; i < n; i++)
{
action();
}
return sw.ElapsedMilliseconds;
}
EZI: 3548
Shar1er80: 24362
Modified-EZI: 1782
MoreLinq'sBatch: 1300