【问题标题】:C# How to add values of all variables of an object to a list?C#如何将对象的所有变量的值添加到列表中?
【发布时间】:2020-04-08 19:14:10
【问题描述】:

我有一个包含一些字符串的类:

public class Headers
{
    public string FirstStaticColumn { get; set; }
    public string ItemFrom { get; set; }
    public string PinFrom { get; set; }
    public string TerminalFrom { get; set; }
    public string CableLabel { get; set; }
    public string WireLabel { get; set; }
    public string CrossSection { get; set; }
    public string ItemTo { get; set; }
    public string PinTo { get; set; }
    public string TerminalTo { get; set; }
    public string CableEndsleeve { get; set; }
    public string LengthMM { get; set; }
}

现在我需要这些属性的所有值并将它们存储在一个列表中。

有没有比做更快的方法

Headers headers = new Headers(); /*Let's pretend that all Variables have a value now*/
List<string> list = new List<string>();

list.Add(headers.FirstStaticColumn);
list.Add(headers.ItemFrom);
list.Add(headers.PinFrom);
...

【问题讨论】:

  • 你拥有它的方式很好。另一种选择是向 Headers 添加一个属性,该属性返回属性值的IEnumerable&lt;string&gt;。然后list.AddRange(headers.NewPropertyNameHere);
  • 你考虑过反射吗?这可能合适也可能不合适,具体取决于您这样做的原因以及您需要对列表进行多少控制。
  • 更快,不,更简洁,是;你可以使用反射。

标签: c#


【解决方案1】:

如果改为这样做,速度会略有提高:

string[] array1 = new string[] { headers.FirstStaticColumn, headers.ItemFrom, headers.PinFrom };

一方面,它处于Speed Rant 的不同领域。另一方面,除非您继续添加到列表中,否则您只是在浪费资源,没有保留基本数组。

我不同意评论者建议的反思。反射肯定更慢,并且只能用作后备,而不是您的首选。如果编写代码是不可能的(未知的输入类型)或不可行的(输入类型太多),我认为它是有效的。但在所示的情况下?我认为没有理由诉诸反思。

【讨论】:

  • 我也不建议对此进行反思。相对而言,巨大的性能冲击。 +1
  • 如果 OP 不想要一个数组,那么设置 List 的容量会带来类似的速度提升。
  • @mjwills 同意。对于那些想要代码的人,List&lt;T&gt; 的构造函数接受一个 int 来调整底层数组的大小。此建议可避免不必要的数组大小调整和复制。
【解决方案2】:

使用反射,可以像这样实现

Headers headers = new Headers(); /*Let's pretend that all Variables have a value now*/
List<string> list = new List<string>();
foreach (var item in headers.GetType().GetProperties())
{
  list.Add(item.GetValue(headers)?.ToString());
}

是的,它会影响性能,但这样一来,每当您将新属性添加到 Headers 类时,都不需要维护它

【讨论】:

  • 我只能重复,在这里使用反射既慢又可能是不必要的,鉴于所示的情况。您需要做的所有事情,您都知道在编译时要做。 Headers 看起来不像会突然增长一些额外属性的类型。我可能会看到使用反射的理由是“编写它会做很多工作,而且我可能会忘记稍后更新它”。但后来我真的对反思有偏见。
  • 100% 同意@Christopher,如果有人觉得它有帮助,就演示了如何使用反射。可能他们在多个文件中具有部分头类,并由多个开发人员维护。
【解决方案3】:

可以做这样的事情。

它不那么冗长吗?并不真地。我想说的优势是将功能重构到类本身中,这可能是可取的,也可能不是。

为了简洁起见,我编辑了属性名称和计数。

public class Headers
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }

    public IEnumerable<string> GetPropertyValues()
    {
        yield return A;
        yield return B;
        yield return C;
    }
}

我可以通过反射减少这段代码的冗长和“免维护”,但我个人不会在性能上进行权衡。

但如果你想使用反射,这可行:

public class Headers
{
    //You can modify this to get certain properties if you want, like public only
    private static readonly PropertyInfo[] properties = typeof(Headers).GetProperties();

    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }

    public IEnumerable<string> GetPropertyValues()
    {
        foreach (var prop in properties)
            yield return prop.GetValue(this)?.ToString();
    }
}

缓存PropertyInfo 数组比其他反射方法有一点优势。但同样,反射很慢。

【讨论】:

    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多