C# 重构两个具有不同内部for循环的相似函数

C# 重构两个具有不同内部for循环的相似函数,c#,C#,我想减少项目中的代码重复。我有一个静态助手类,有两个方法Create和Delete,如下所示: public static void Create(List container) { // cannot use foreach, because container elements could be deleted for(var i = 0; i < container.Count; i++) { var operation = new Creat

我想减少项目中的代码重复。我有一个静态助手类,有两个方法
Create
Delete
,如下所示:

public static void Create(List container)
{
    // cannot use foreach, because container elements could be deleted
    for(var i = 0; i < container.Count; i++)
    {
        var operation = new Creator(container[i]);
        operation.Exec();
        operation.Dispose();
    }
}

public static void Delete(List container)
{
    // cannot use foreach, because container elements could be deleted
    for(var i = 0; i < container.Count; i++)
    {
        var operation = new Deleter(container[i]);
        operation.Exec();
        operation.Dispose();
    }
}
publicstaticvoidcreate(列表容器)
{
//无法使用foreach,因为容器元素可能被删除
对于(var i=0;i
你看,这些方法都有相同的外部构造,for循环,然后创建一个操作,然后执行
Deleter
Creator
具有相同的基类。方法的实际长度更长,但除了
var操作new…()

我如何才能更改此代码,使其不再重复

提前谢谢

我建议提取一个方法(
Perform
),添加
builder
lambda函数来创建
Creator
Deleter

private static void Perform(List container, Func<object, Operation> builder)
{
    // cannot use foreach, because container elements could be deleted
    foreach (var item in container)
      using (var operation = builder(item))
      { 
         operation.Exec();  
      } 
}

public static void Create(List container) => Perform(list, (item) => new Creator(item));

public static void Delete(List container) => Perform(list, (item) => new Deleter(item));
private static void Perform(列表容器、函数生成器)
{
//无法使用foreach,因为容器元素可能被删除
foreach(容器中的var项)
使用(var操作=生成器(项目))
{ 
Exec()操作;
} 
}
公共静态作废创建(列表容器)=>执行(列表,(项目)=>新创建者(项目));
公共静态作废删除(列表容器)=>执行(列表,(项目)=>新建删除器(项目));
我建议通过添加
builder
lambda函数来提取方法(
Perform
),以创建
Creator
Deleter

private static void Perform(List container, Func<object, Operation> builder)
{
    // cannot use foreach, because container elements could be deleted
    foreach (var item in container)
      using (var operation = builder(item))
      { 
         operation.Exec();  
      } 
}

public static void Create(List container) => Perform(list, (item) => new Creator(item));

public static void Delete(List container) => Perform(list, (item) => new Deleter(item));
private static void Perform(列表容器、函数生成器)
{
//无法使用foreach,因为容器元素可能被删除
foreach(容器中的var项)
使用(var操作=生成器(项目))
{ 
Exec()操作;
} 
}
公共静态作废创建(列表容器)=>执行(列表,(项目)=>新创建者(项目));
公共静态作废删除(列表容器)=>执行(列表,(项目)=>新建删除器(项目));

我将使用一个helper方法,该方法获取一个委托来创建对象

private static Execute(List<SomeClass> container, Func<Someclass, BaseClass> create)
{
    for(var i = 0; i < container.Count; i++)
    {
        var operation = create(container[i]);
        operation.Exec();
        operation.Dispose();
    }
}
private static Execute(列表容器,Func create)
{
对于(var i=0;i
在你最初的方法中,你会这样称呼它:

public static void Create(List<SomeClass> container) =>
    Execute(container, x => new Creator(x));

public static void Delete(List<SomeClass> container) =>
    Execute(container, x => new Deleter(x));
publicstaticvoidcreate(列表容器)=>
执行(容器,x=>newcreator(x));
公共静态无效删除(列表容器)=>
执行(容器,x=>newdeleter(x));

这里我假设
容器
是一个通用列表。

我将使用一个helper方法,该方法获取一个委托来创建对象

private static Execute(List<SomeClass> container, Func<Someclass, BaseClass> create)
{
    for(var i = 0; i < container.Count; i++)
    {
        var operation = create(container[i]);
        operation.Exec();
        operation.Dispose();
    }
}
private static Execute(列表容器,Func create)
{
对于(var i=0;i
在你最初的方法中,你会这样称呼它:

public static void Create(List<SomeClass> container) =>
    Execute(container, x => new Creator(x));

public static void Delete(List<SomeClass> container) =>
    Execute(container, x => new Deleter(x));
publicstaticvoidcreate(列表容器)=>
执行(容器,x=>newcreator(x));
公共静态无效删除(列表容器)=>
执行(容器,x=>newdeleter(x));

我在这里假设
容器
是一个通用列表。

tbh,我现在不关心复制,而是关心“操作”对象的过度创建/破坏。我投票结束这个问题,因为你的问题听起来有点像代码改进,如果是的话,那么可能与主题无关。它可能更适合其他SE站点,但请务必阅读相关常见问题解答;和/或在交叉发布前根据需要重新措辞您的问题。祝你好运@费尔多,随你怎么说。这是对实际问题的简化,好吧。正如我所说,也许你需要退一步,对设计提出质疑。MickyD在这一点上有一点是关于这个问题是离题的,所以,我恐怕。@Fildor谢谢你的设计建议,但我必须实现一个给定的接口,我不能改变它,我现在不关心复制,而关心“操作”的过度创建/破坏对象。我投票结束这个问题,因为你的问题听起来有点像代码改进,如果是的话,可能会偏离主题。它可能更适合其他SE站点,但请务必阅读相关常见问题解答;和/或在交叉发布前根据需要重新措辞您的问题。祝你好运@费尔多,随你怎么说。这是对实际问题的简化,好吧。正如我所说,也许你需要退一步,对设计提出质疑。MickyD有一点是关于这个问题已经脱离主题了,所以,我很抱歉。@Fildor谢谢你的设计建议,但我必须实现一个给定的接口,我不能改变它。你不同意在每次迭代中创建一个新的短期对象会有一些味道吗,Dmitry?编辑:OP对此没有选择=>+1@Fildor:我怀疑我们能否避免这种情况(创建一个
Creator
/
Deleter
并为其分配
container
项目):我们对
Creator
/
Deleter
容器的大小一无所知(以及为什么它是List`类型而不是,比如说
List
);当提供更多的代码(包括初始问题)时,我们可以详细说明更好的实现。我想这就是为什么米基德投票决定关闭。德米特里,你不同意在每次迭代中创建一个新的短期对象有点异味吗?编辑:OP对tha没有选择