在c#中添加和删除列表中的项目失败

时间:2017-07-24 15:37:40

标签: c#

我有几个动态文本框,每当文本框失去焦点时,我想将其文本值添加到列表中,并在文本框被清除时删除

<TextBox LostFocus="comment_box_LostFocus" Name="comment_box" Tag="{x:Bind id}" Width="300"/>

现在关于c#代码

List<CommentModel> commentlist = new List<CommentModel>();

private void comment_box_LostFocus(object sender, RoutedEventArgs e)
{
    var comenttext = ((TextBox)sender).Text; //this is okay
    var commentid = ((TextBox)sender).Tag; //this is okay

    if (String.IsNullOrEmpty(comenttext)) //incase user clears the textbox
    {
        for(var i=0; i< commentlist.Count; i++)
        {
            if(commentlist[i].id == (int)commentid)
            {
                var itemToRemove = commentlist.Single(r => r.id == (int)commentid);
                commentlist.Remove(itemToRemove);
            }
        }
    }
    else //add new or update incase its a comment change
    {  
        for (var i = 0; i < commentlist.Count; i++)
        {
            if ((commentlist[i].id) == ((int)commentid))
            {
                commentlist[i].comment = comenttext;
            }
            else
            {
                 commentlist.Add(new CommentModel((int)commentid, (string)comenttext));
            }
        }
        }

            if (commentlist.Count == 0)
            {
                Debug.WriteLine("Comment list is empty adding initial comment");
                if (!String.IsNullOrEmpty(comenttext))
                {
                    //automatically add new
                    commentlist.Add(new CommentModel((int)commentid, (string)comenttext));
                }
            }
    }
}

CommentModel类是

class CommentModel
{
    public int id;
    public string comment;

    public CommentModel(int idval, string commentval)
    {
        this.id = idval;
        this.comment = commentval;
    }
}

每当我尝试

for(var i=0; i< commentlist.Count; i++)
{
    Debug.WriteLine(commentlist[i].comment);
}

是评论的双重复制

first entry: "test one", debug output "test one", 
second entry :"no2", debug output :"test one", "no2"....

我哪里可能出错?

1 个答案:

答案 0 :(得分:0)

您需要将代码更改为以下内容:

if (String.IsNullOrEmpty(comenttext)) //incase user clears the textbox
{
    for (var i = 0; i < commentlist.Count; i++)
    {
        if (commentlist[i].id == (int)commentid)
        {
            var itemToRemove = commentlist.Single(r => r.id == (int)commentid);
            commentlist.Remove(itemToRemove);
            break;
        }
    }
}
else
{
    bool found = false;
    for (var i = 0; i < commentlist.Count; i++)
    {
        if ((commentlist[i].id) == ((int)commentid))
        {
            commentlist[i].comment = comenttext;
            found = true;
            break;
        }
    }
    if (! found)
        commentlist.Add(new CommentModel((int)commentid, (string)comenttext));
}

在你的原始代码中,你遍历列表中的每个元素,如果id匹配你更新评论,如果不匹配你总是添加另一个条目 - 所以你最终会有多个重复的条目。

您需要搜索列表&amp;只有在找不到条目时才添加,如果找到了id,则可以停止搜索列表。

同样,你可以在找到if子句中的条目后退出循环,但在这种情况下你只会浪费时间,因为你已经删除了id的条目

没有for循环的较短LINQ解决方案可能是:

var itemInList = commentlist.Where(li => li.id == (int)commentid).FirstOrDefault();
if (String.IsNullOrEmpty(comenttext)) //incase user clears the textbox
{
  if (itemInList != null)
    commentlist.Remove(itemInList);
}
else //add new or update incase its a comment change
{
  if (itemInList != null)
    itemInList.comment = comenttext;
  else
    commentlist.Add(new CommentModel((int)commentid, comenttext));
}