【问题标题】:c# to split Dynamic arraysc#拆分动态数组
【发布时间】:2013-11-26 15:51:07
【问题描述】:

今天我记录了这样一个请求。

我在一个类中定义了五个地址参数,但五个地址可能为空或有值。

五个地址在数据库中存储一个字段,像这样(email1;email2;....)

当存储数据库时,我需要在页面中获取五个文本框来填充地址添加“:”,这样就可以了。

那么问题是,当我从数据库中获取数据并在页面的五个文本框中显示值时。

如果地址有值,则显示带有五个文本框的页面。没有数据,显示为空。

那么,如何将动态邮件列表解析为五个文本框。

string [] emailList = sourceEmail.split(‘;’);
    foreach(string email in emailList)
    {
    this.email0 =?
    this.email1=?
    this.email2=?
    .......
    }

我知道这行不通,因为我们不知道 emailList 有多少价值。

我知道一种方法可以工作,但似乎不太好。

string [] emailList =sourceEmail.Split(';');
if(emailList.length ==1)
{
this.email0 = emailList[0];
}
if(emailList.length==2)
{
this.email0 = emailList[0];
this.email1 = emailList[1];
}

if(emailList.length==3)
{
this.email0 = emailList[0];
this.email1 = emailList[1];
this.email2 = emailList[2];
}

我认为这不是一个好方法。 有人可以帮我吗?

【问题讨论】:

  • 只需检查emailList.Length 并采取相应措施...
  • 哦,顺便说一句,five address store one field in Database ,like this (email1;email2;....) 这是你不应该做的。阅读数据库规范化。
  • 哈哈,我做的是增强项目,不是新项目,客户要求,我们尽量不要修改数据库结构。如果修改数据库结构。那么有很多工作要做。
  • 同意@Leri,考虑将电子邮件存储在单独的表中,并使用 FK 约束根据您正在处理的任何实体获取它们
  • @chengdu.jack 好吧,你必须选择现在做很少的工作并最终得到需要完全重写的垃圾,或者做更多的工作并使项目可维护。 :)

标签: c# split


【解决方案1】:

在 FormLoad 或其他地方的列表中添加文本框。

    void OnFormLoad(Object sender, EventArgs e)
    {
        List<TextBox> texboxesWithEmail = new List<TextBox> { textBox1, textBox2, textBox3, textBox4, textBox5 };
        string[] emails = new string[] { "test@test.test", "...." };
        PutEmailsInTexboxes(emails, texboxesWithEmail);
    }
    void PutEmailsInTexboxes(string[] emails, List<TextBox> textBoxes)
    {
        if (emails.Count() != textBoxes.Count) return;
        for (var i = 0; i < emails.Count(); i++)
        {
            textBoxes[i].Text = emails[i];
        }
    }

【讨论】:

  • 您不需要emails.Any()for 会解决这个问题。
  • @KingKing 但是,您必须确保texboxesWithEmail.Count &gt;= emails.Length 否则您将留下IndexOutOfRangeException。 :)
  • @Leri 刚才讲了Any()的使用,完全没有必要,for循环的条件i &lt; emails.Length会保证一切都是有效的。
【解决方案2】:

只是一个循环怎么样?

string [] emailList = sourceEmail.Split(';');

for (int i = 0; i < emailList.Length; i++)
{
    switch (i)
    {
        case 0:
            this.email0 = emailList[i];
            break;
        case 1:
            this.email1 = emailList[i];
            break;
       ....//Do it for all variables
    }
}

您可以通过反思做得更好,但这需要付出自己的代价。

【讨论】:

  • 如果我用这种方式,那么只有一个文件会被填满
  • @chengdu.jack 对不起,你什么意思?你必须完成开关盒才能休息..
【解决方案3】:

我认为主要问题是您在班级中将这五个地址作为单独的字段/属性。这样你就不能灵活地设置例如其中只有三个没有像您发布的冗长的 if 块或诉诸反射,这对于像您这样的简单案例来说是一个荒谬的想法。

我建议将这些电子邮件存储在 List 中。这样您就可以拥有一个长度灵活的集合,并且可以轻松使用forwhile 循环,而无需借助开关。将您的 email0emailemail2 等更改为单个 List&lt;string&gt; emails。然后你可以这样做:

for (int i = 0; i < emailList.Length; i++)
{
    this.emails[i] = emailList[i];
}

如果你不能或不想改变你的班级,那么 AstralisSomnium 或 Sriram Sakthivel 的解决方案会很好。

【讨论】:

  • 您的解决方案似乎是一个好方法,但在这里,我不能使用数组或列表。毕竟,谢谢
【解决方案4】:

您可能希望使用 ControlCollection 来识别文本框。

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection(v=vs.110).aspx

因此,您可以使用该键找到您选择的控件(在您的情况下是名为 emailx 的文本框)。追加循环的索引以完成循环中的键名。你完成了。而且您不必对现有代码进行任何更改。

string[] emailList = sourceEmail.split(';');

for (int i = 0; i < emailList.Length; i++) {
    this.Controls("email" + i).Text = emailList[i];
}

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 2011-03-20
    • 2014-08-19
    • 2012-11-23
    相关资源
    最近更新 更多