【问题标题】:C# - Array Infrastructure in a Class using ControlsC# - 使用控件的类中的数组基础结构
【发布时间】:2016-03-03 22:09:05
【问题描述】:

我只是好奇这是否可以实现:我目前遇到了一个问题,我使用控制器在类中设置和获取数据,这是通过处理程序端的方法和实例完成的。

我只是想知道,因为对于您的项目所包含的每个属性,执行 public string x { get; set; } 可能会变得非常冗长。

有没有办法让我在一个班级里实现这种意识形态?

public core Array[] (
          Option1 => string Array[] (
             Name => 'example'
          ),
          Option2 => String Array[] (
             Name => 'example2'
          ) { set; get; }
);

当然,这只是一个理论,并不是确切的解决方案。我想知道我是否会:

1) 将数据附加到索引时需要一个控制器。
2)需要实例化控制器处理的类,或者我是否可以通过主类方法来实现。
3) 需要一个多维数组或列表。

我目前的解决方案是冗长的,并且由于核心站点使用大量数据,它的响应随着添加的每个功能而下降。

任何人都可以参考任何基础设施参考资料,或者可能介绍一下如何使用这种意识形态实际分配属性吗?

提前谢谢你。

编辑:我的意思是这样的(PHP):

$example = array (
    'location1' => array(
        'location_id' => 1
    ),
    'location2' => array(
        'location_id' => 2
    )
);

现在可以通过以下方式更轻松地处理数据:

foreach($example as $k=>$v){ // todo: handle }

所以这里 $k 成为您的数组名称(即可以是名称、地址),而 $v 成为您的嵌套数组,使数据更易于处理。

【问题讨论】:

  • 输入prop 然后按tab
  • 我是C# 的新手,如果这个问题没有得到最好的描述,我深表歉意。我不明白你的评论指的是什么?不过,感谢您的输入,@dotctor
  • @KyleE4K:“更短的代码”和“更简单的代码”并不总是同义词。这在 PHP 中确实有意义,但在 C# 中却没有那么大,因为它是一种非常不同的语言。
  • @KyleE4K:属性本身和这些属性的类型是两个不同的东西。在 C# 和 Java 等语言中,使用无类型数组存储类结构是一个众所周知的坏主意。存在专门用于避免这样做的重构模式。
  • @KyleE4K:它并没有真正回答这个问题,我怀疑这是因为这个问题与真正要解决的问题无关。大概您在 C# 中有一些您认为不是“干净”或以某种方式可维护的代码,并且您想让它“更好”。您已经假设了一种基于不同语言的方法,但这种方法在这里没有多大意义。虽然代码审查本身在这里是题外话,但您可能会从 Martin Fowler 的 Refactoring Patterns 或 Robert Martin 的“Clean Code”一书中找到重构 C# 代码的一些帮助。

标签: c#


【解决方案1】:

虽然我强烈反对这种模式的用法,但我仍然认为了解这一点很有价值。

我认为您正在寻找Dictionary<TKey, TValue>。它提供了一种将任何类型的键映射到任何类型的值的方法。对于您的用例:

IDictionary<string, string> DynamicProperties {get; set;} = new Dictionary<string, string>
{
    { "FirstName", "John" },
    { "LastName", "Doe" }
};

然后您可以使用循环遍历您的“属性”:

foreach(KeyValuePair pair in DynamicProperties)
{
    string key = pair.Key; // "FirstName", "LastName"
    string value = pair.Value; // "John", "Doe"
    // Use them as you wish.
}

您也可以拥有字典。为了匹配您更新的示例:

IDictionary<string, IDictionary<string, int>> Example {get; set;} = new Dictionary<string, IDictionary<string, int>>
{
    {"location1", new Dictionary<string, int> {{"location_id", 1}}},
    {"location2", new Dictionary<string, int> {{"location_id", 2}}}
};

但是看看这段代码 - 你在寻找简单性。这一点都不简单,也不简短、清晰或可测试。拥有类和属性是 C# 的必经之路。

我认为问题的根源在于您使用 C# 进行编码,但使用 PHP 的想法进行思考。 C#是强类型,而PHP是弱类型,(参见wiki article),你需要适当地重新调整你的想法。

【讨论】:

  • 看,我在 PHP 上花了 4 年时间。最近在 C# 中实习,看到 C# 有多长真是太疯狂了。我仍然不明白为什么人们不使用 Hack,因为就像你说的那样,它使用 弱类型 语言,但具有C 语言的优化性能。这些 C# 控制器、处理程序和实例非常令人困惑:/ 不过感谢您帮助我理解!
  • @KyleE4K 更长的时间不一定更糟,编写最紧凑的代码不应该是目标,编写最可维护和可读的代码应该是目标。很多语言都有不同的意识形态,你可以这样看:在罗马时,像罗马人那样做......
  • Gediminas,将字典设置为IDictionary&lt;string, object&gt; 看到不仅字符串进入那里不是更有意义吗?然后可以很容易地添加一个新的 Dictionary 作为任何属性的值?虽然我非常同意你的批评意见;)
  • 这会做所有的事情,并且是可维护和可读的:pastebin.com/xHZDH3h4 @Icepickle 将其转换为 Hack 并且您的性能得到提升,页面加载平均为 2/3 秒。这个C# 太令人困惑了xD,但谢谢! - 有时最慢的并不总是赢得比赛:)
  • @Icepickle 我不会这么说,因为那时您需要将object 转换回原始类型,只要您希望使用存储的值。现在,您可以考虑IDictionary&lt;string, dynamic&gt;...但我们不要。
【解决方案2】:

我建议看看 MVC 中使用的 ViewBag 是如何工作的

这里有一个很好的链接

How ViewBag in ASP.NET MVC works

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 2014-02-19
    • 1970-01-01
    相关资源
    最近更新 更多