Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理一批项目,返回要报告状态的对象_C#_Design Patterns - Fatal编程技术网

C# 处理一批项目,返回要报告状态的对象

C# 处理一批项目,返回要报告状态的对象,c#,design-patterns,C#,Design Patterns,我正在寻找以下场景的模式(或良好实践): 我的函数List Process(List Data){..}将处理一个数据列表,并返回批次中每个项目的处理位置信息 struct BatchItemResponse { int BatchItemID; bool Processed; string Description; } 有什么想法吗?我的建议是否尽可能好?你可以完全按照你的建议去做——它会很好地工作。但既然你在谈论模式,那么根据你的目标,有两种潜在的优雅的可能性 您可以使用迭代器模式(其细节

我正在寻找以下场景的模式(或良好实践):

我的函数
List Process(List Data){..}
将处理一个数据列表,并返回批次中每个项目的处理位置信息

struct BatchItemResponse { int BatchItemID; bool Processed; string Description; }

有什么想法吗?我的建议是否尽可能好?

你可以完全按照你的建议去做——它会很好地工作。但既然你在谈论模式,那么根据你的目标,有两种潜在的优雅的可能性

您可以使用迭代器模式(其细节被.NET可爱的枚举器巧妙地隐藏起来):

IEnumerable进程(列表数据)
{
foreach(数据中的批处理项)
{
BatchItemResponse结果=新的BatchItemResponse();
result.Processed=ProcessItem(项目);
收益结果;
}
}
或者,您可以通过为感兴趣的观察者触发事件来使用观察者模式:

public class EventArgs<T> : EventArgs
{
    public EventArgs(T value)
    {
        m_value = value;
    }

    private T m_value;

    public T Value
    {
        get { return m_value; }
    }
}

public event EventHandler<EventArgs<BatchItemResponse> ItemProcessed;

public void Process(List<BatchItem> Data)
{
    foreach (BatchItem item in Data)
    {
        BatchItemResponse result = new BatchItemResponse();
        result.Processed = ProcessItem(item);
        if (ItemProcessed != null)
        {
            ItemProcessed(this, new EventArgs<BatchItemResponse>(result));
        }
    }
}
公共类EventArgs:EventArgs
{
公共事件参数(T值)
{
m_值=值;
}
私人T m_值;
公共价值
{
获取{返回m_值;}
}
}

public event eventhandler您提出了解决方案,但没有说明问题。在这里很难看出您的解决方案是否与您的问题相匹配:-)以上没有问题,我只是在寻找最佳解决方案。最佳解决方案用于什么?如果您需要返回ID、说明以及是否为每个批次项目处理了批次项目,那么您已经找到了最佳解决方案:-)
public class EventArgs<T> : EventArgs
{
    public EventArgs(T value)
    {
        m_value = value;
    }

    private T m_value;

    public T Value
    {
        get { return m_value; }
    }
}

public event EventHandler<EventArgs<BatchItemResponse> ItemProcessed;

public void Process(List<BatchItem> Data)
{
    foreach (BatchItem item in Data)
    {
        BatchItemResponse result = new BatchItemResponse();
        result.Processed = ProcessItem(item);
        if (ItemProcessed != null)
        {
            ItemProcessed(this, new EventArgs<BatchItemResponse>(result));
        }
    }
}