如何在C#循环内返回结果?

时间:2012-08-17 19:27:39

标签: c# .net

基本上,我有一个Do..While循环遍历文本文件中的某些行。我想处理一行,返回一个值(工作或没有),然后移到下一行。

我有一个名为ProcessTXT的函数,它接受2个字符串。新文件的SourceDestination

有没有办法为结果设置ReturnedValue string =并让后台工作人员检查变量是否发生了变化?如果是这样,请将此值添加到列表框中吗?

private void TranslatePOD(string strSource, string strDest,)
{
  TextWriter tw = new StreamWriter(strDest);
  TextReader tr = new StreamReader(strSource);
  do
    {
      //My Code doing stuff
      //Need to send a result somehow now, but i have more work to do in this loop
      //Then using tw.writeline() to write my results to my new file
    } while (tr.ReadLine() != null);
}

编辑:使用Yield的当前测试代码。我的输出是" TestingGround.Form1 + d__0"。我做错了什么?

namespace TestingGround
{
public partial class Form1 : Form
{
    static IEnumerable<string> TestYield(string strSource) 
    {
        TextReader tr = new StreamReader(strSource);
        string strCurLine = System.String.Empty;

        while ((strCurLine = tr.ReadLine()) != null)
        {
            yield return strCurLine;
        }
    }

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string MySource = System.String.Empty;
        MySource = @"C:\PODTest\Export Script\Export\Shipment List.csv";
        listBox1.Items.Add(TestYield(MySource));

    }
}

2 个答案:

答案 0 :(得分:5)

Yield通常用于迭代或流式返回结果。网上有很多例子。在SO上有one来读取文件。

答案 1 :(得分:2)

听起来这对于生产者/消费者队列来说是个好例子。 C#4.0引入了BlockingCollection,这对此非常有用。创建阻塞集合并确保此过程以及需要使用您传递的结果的任何内容都可以访问它。此方法可以向队列中添加项目,无论读取结果的是什么,都可以使用Take方法,这将阻止[等待],直到至少有一个项目要取出。该系列专为在多线程环境中工作而设计;所有操作都是逻辑原子的。