當你正在使用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