【问题标题】:Avoid adding same item in Observable Collection using C#避免使用 C# 在 Observable Collection 中添加相同的项目
【发布时间】:2016-09-15 17:20:26
【问题描述】:

我有以下事情:

ObservableCollection<dateListModel> model = new ObservableCollection<dateListModel>();

public class dateListModel
{
    public string dateSelected { get; set; }
    public string requestFor { get; set; }
    public int id { get; set; }
    public string weekDay { get; set; }
}

使用以下代码将项目添加到 ObservableCollection:

public void onAddClicked(object sender, EventArgs e)
        {           
            try
            {   
                if (model.Any (p =>string.Format("{0:yyyy-MM-dd}", p.dateSelected.ToString())==string.Format ("{0:yyyy-MM-dd}",myDatePicker.Date.ToString()) == false))
                {
                    model.Add (new dateListModel {
                        dateSelected = string.Format("{0:yyyy-MM-dd}", myDatePicker.Date),
                        requestFor = requestFor.Items [requestFor.SelectedIndex],
                        id = 1,
                        weekDay = myDatePicker.Date.DayOfWeek.ToString ()
                    });

                    listview_MenuItem.ItemsSource = model;
                } 
                else
                    DisplayAlert ("Alert", "Already Exist!", "OK"); 
            }
            catch(Exception ex) 
            {
                DisplayAlert ("Alert",ex.ToString(),"OK");
            }
        }

但是当我点击添加按钮时,它会显示“已经存在”消息,即使模型是空的。无论我如何在模型中添加项目并尝试再次添加相同的项目,它都允许添加 ObservableCollection。我不想在我的模型中再次添加相同的日期。我哪里错了?

【问题讨论】:

    标签: c# observablecollection


    【解决方案1】:

    试试这个:

    if (!model.Any(p => p.dateSelected.Date == myDatePicker.Date))
    {
        model.Add (new dateListModel { dateSelected = string.Format("{0:yyyy-MM-dd}", myDatePicker.Date), requestFor = requestFor.Items [requestFor.SelectedIndex], id = 1, weekDay = myDatePicker.Date.DayOfWeek.ToString()});
        listview_MenuItem.ItemsSource = model;
    }
    

    您不必最初将所有日期转换为相同的字符串格式来检查数据库中是否存在具有该日期的记录。另外,!Any... 等价于Any... == false

    【讨论】:

    • 我用过:if (!model.Any(p => p.dateSelected.date == myDatePicker.Date.ToString()))。它不工作。要使上面的代码工作,DatePicker 的日期格式应该是什么?
    • 如果您使用.Date,日期格式将无关紧要。因此从您的myDatePicker.Date.ToString() 中删除.ToString() 并尝试。我还有一个错字,应该是p.dateSelected.Date 而不是p.dateSelected.date
    • 嗨,谢谢。我用过:if (!model.Any(p =>Convert.ToDateTime(p.dateSelected.date) == myDatePicker.Date))。效果很好。
    【解决方案2】:

    您可以直接比较两个日期,而无需将其转换为字符串。附加说明,您不需要使用.ToString() 来获取特定格式的日期,当您使用时,日期将转换为字符串,然后该格式将不会按您的预期应用。如果您使用.ToString(),则将格式指定为方法的参数(如DateTime.Now.ToString("yyyy-MM-dd"))。

    简而言之,您必须像这样更改条件才能使其正常工作。

    if (!model.Any(p =>p.dateSelected==myDatePicker.Date))
    {
    
       // Add new object to the collection
    }
    else
       DisplayAlert ("Alert", "Already Exist!", "OK");
    

    【讨论】:

    • 我们不能比较日期和字符串(因为 p.dateselected 是一个字符串)
    猜你喜欢
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多