【问题标题】:C# Encapsulation - Convert a foreach loop into a linear code [closed]C# 封装 - 将 foreach 循环转换为线性代码 [关闭]
【发布时间】:2016-03-31 11:15:58
【问题描述】:

我有一个List<DrivingData> dataList = new List<DrivingData>(),在哪里

public class DrivingData
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Age { get; set; }
}

List 必须这样使用:

foreach (var data in dataList)
{
    //Do stuffs with data.Id
    //Do stuffs with data.Name
    //Do stuffs with data.Age
}

但我想要上面的等价物,不显示 foreach 循环,像这样:

public void Do()
{
    //Without foreach, but all statements will be repeated for each data in the List
    Console.WriteLine(data.Id + data.Name + data.Age);
    DoSomethingElse(data.Name);
    DoMoreStuffs(data.Age);
}

Do() 方法将向用户公开。用户只需以线性格式写下语句,每条语句都会针对列表中的每个元素重复。

我怎样才能做到这一点?

【问题讨论】:

  • 你可以尝试使用递归,因为现在内存很便宜......
  • 直接使用 List.Foreach
  • foreach 有什么问题?
  • @TimSchmelter,Do() 将向用户公开。我希望这种方法看起来干净且线性。
  • @Liren:还不清楚。如果您不希望 Do 具有参数,但该方法仍然可以访问列表,那么在 Do 中使用 foreach 有什么反对意见? 用户 看不到实现。此外,foreach 是一种非常简洁的方式来完全枚举列表。

标签: c# list foreach encapsulation


【解决方案1】:

您可以在 foreach 循环的每次迭代中简单地调用 Do 方法:

public void SomeMethod ()
{
    foreach (var data in dataList)
    {
        Do(data);
    }
}

public void Do (DrivingData data)
{
    Console.WriteLine(data.Id + data.Name + data.Age);
}

这样,您可以将您的逻辑放入Do 方法中,而不必关心实际上不止一个项目。而其他方法中的 foreach 循环将负责为每个项目调用 Do 方法。

【讨论】:

  • 我不希望 Do() 方法包含任何参数。让它们全球化?
  • 你真的不能那样做。您可以将其设置为在 for 循环中更改的实例字段,但这会使您的代码易受攻击。全局变量通常不好。这是解决这个问题的更好方法。
  • “我希望这个方法看起来干净且线性。” – 参数的好处还在于它非常干净且清晰。看到该方法的用户立即知道他们可以访问data 以及它是什么而不是来自其他地方的一些“神奇”事物。
  • 仍然希望有一种没有参数的方法。我的意图是:用户只需要知道 2 件事 - 1. 他们可以在任何地方创建 Do(),并且知道每个语句都会重复,2. data.Something 将从 Excel 中返​​回该数据(已存储在List)
  • 他们无法在任何地方创建Do();这不是这样的。为了调用Do() 方法,该方法需要存在并且位于非常具体的 位置。所以你不应该告诉他们自己创建方法(如果你已经担心他们被循环混淆了,他们可能会搞砸),而是提供一个具有正确签名的空存根方法,并提供正确的论据。然后,他们只需要在那里填写他们的逻辑。
【解决方案2】:

您可以改用List<T>.ForEach

public void Do()
{
    var dataList = new List<DrivingData>();

    dataList.ForEach(d => Console.WriteLine(d.Id + d.Name + d.Age));
}

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多