如何在文本文件

时间:2017-10-17 05:49:54

标签: c# .net linq

我正在使用File.AppendAllLines将字符串写入文本文件,现在我想写一个单词' Pause'在每50行后,如何在File.AppendAllLines代码中执行此操作? 这是我正在做的代码

string test;
foreach (DataRow dr in dt.Rows)
{
    test=GetData(dr);
    File.AppendAllLines("tEST.txt", new string[] { test });
}

3 个答案:

答案 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>。显然,您的RowGetData,会返回一个字符串。

因此,将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);