我正在使用File.AppendAllLines
将字符串写入文本文件,现在我想写一个单词' Pause'在每50行后,如何在File.AppendAllLines
代码中执行此操作?
这是我正在做的代码
string test;
foreach (DataRow dr in dt.Rows)
{
test=GetData(dr);
File.AppendAllLines("tEST.txt", new string[] { test });
}
答案 0 :(得分:4)
将foreach循环切换为for循环,并检查模50的循环控制值。
for (int i = 0, i < dt.Rows.Count (), i++ )
{
test=GetData(dt.Rows[i]);`
if(i % 50 == 0)
//Pause
File.AppendAllLines("tEST.txt", new string[] { test });
}
答案 1 :(得分:0)
在这种情况下有2个解决方案:
case1:如果在运行时,您逐行追加到文件。您可以使用变量类型 int 。对于每个你追加行的文件,这个变量增量。 检查此变量等于50,将“暂停”行添加到文件中。
案例2:如果您的文件大约有1000行,则可以使用'\ n'拆分。并使用for循环来做这个案例
答案 2 :(得分:0)
当您使用Linq标记时,我假设您希望将代码转换为linq语句。
虽然您没有提到它,但我认为您的dt
是一个DataTable,dt.Rows
会返回DataRowCollection
。此集合实现IEnumerable<Row>
。显然,您的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。在函数内部, 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行之后追加“Pause”作为一个单独的行:
const string wordToAppend = "Pause";
const int lineCount = 50;
var result = dt.Rows
.Cast<Row>()
.Select(row => row.GetData())
.AppendWordEveryCount(wordtToAppend, lineCount);