当你正在使用LINQ的标签,我想你,你想将你的代码转换成linq语句。
虽然你没有提到它,我认为你的dt
是一个数据表,dt.Rows
返回DataRowCollection
。这个集合实现了IEnumerable<Row>
。显然你的有一个GetData
它返回一个字符串。
所以步骤来转换dt.Rows
成字符串很简单:
var linesWithoutPause = dt.Rows // returns DataRowCollection
.Cast<Row>() // converts to IEnumerable<Row>
.Select(row => row.GetData()); // from exvery Row extract the data
现在,你想每隔50行之后写的字“暂停”。你没有提到你是否想把这个单词追加到第50行,或者你想把它作为一个单独的行追加。代码将非常相似。
为了让它像Linq一样,最好为它创建一个扩展函数。有关扩展功能的更多信息,请参见Extension Functions Demystified
我们将制作IEnumerable的通用扩展函数,它将在每个count
项目后添加一个类型的对象。这样您就可以将它用于各种集合:每10个整数后附加0;在每20个声音之后附加一个嘟嘟声等。
扩展函数必须处于静态类中。名称并不重要:
static class EnumerableExtensions
{
// add your extension functions here
}
扩展功能相当简单。它必须是静态的,并且第一个参数必须是IEnumerable类型,并且以关键字this开头。该函数的这参数是内部使用,就好像如果是没有这样的:
public static AppendWordEveryCount<T>(this IEnumerable<T> source, T itemToAppend, int count)
{
int counter = 0; // a counter to find every count element
foreach (T item in source)
{
yield return T; // just return the item in your sequence
counter = (counter + 1) % count;
if (i == 0) // after count elements
{
yield return wordToAppend; // append the item
}
}
}
现在回到你的问题:要附加“暂停”,因为每个50行之后的单独一行:
const string wordToAppend = "Pause";
const int lineCount = 50;
var result = dt.Rows
.Cast<Row>()
.Select(row => row.GetData())
.AppendWordEveryCount(wordtToAppend, lineCount);
你有什么数据?该文件是否已经包含内容是你把它放在一起吗?你有什么尝试? –
在换行符上拆分字符串:\ n,并在每50次后添加一次暂停!上帝保佑!向我们展示你的代码? –
此代码位于foreach循环内,我正在迭代1000个集合 – peter