【问题标题】:How do i remove a specific collection from my model in C#如何在 C# 中从我的模型中删除特定集合
【发布时间】:2015-06-30 05:22:00
【问题描述】:

这是我的模型:

    public class ObsModel : BindableBase
    {


        private String _ObsName = string.Empty;
        public string ObsName
        {
            get { return this._ObsName; }
            set { this.SetProperty(ref this._ObsName, value); }
        }

        private String _ObsColor = string.Empty;
        public string ObsColor
        {
            get { return this._ObsColor; }
            set { this.SetProperty(ref this._ObsColor, value); }
        }

        private String _ObsValue = string.Empty;
        public string ObsValue
        {
            get { return this._ObsValue; }
            set { this.SetProperty(ref this._ObsValue, value); }
        }
}

然后我可以使用这个对象填充我的模型。

ObservableCollection<ObsModel> LastObsResults = new ObservableCollection<ObsModel>();

但是,如果我使用下面的代码将观察名称作为字符串变量,我该如何删除特定的集合?

LatsObsResults.Remove( What DO I PUT HERE);

【问题讨论】:

  • 覆盖比较`_ObsName的EqualsGetHashCode方法
  • 确认一下,您拥有ObsModel.ObsName 并想删除具有该名称的对应ObsModels
  • 是的,我想删除与该 obsname 相关的所有内容
  • 可能的重复(有解决方案):stackoverflow.com/questions/5118513/… 这也避免了重新创建集合并允许您删除一个或一组元素。

标签: c# models


【解决方案1】:

您可以通过传入要删除的对象从集合中删除一个对象。这可以通过 Linq 完成,如下所示:

LastObsResults.Remove(LastObsResults.FirstOrDefault(obs => obs.ObsName == name));

【讨论】:

  • 对不起,我对这个应该基于我的代码的 obs 不熟悉
【解决方案2】:

此解决方案使用 LINQ .Where 生成结果的有效子集,然后将该子集分配给新的 ObsevableCollection。我正在使用constructor that accepts an IEnumerable

var validSubset = LastObsResults.Where(obs => obs.ObsName != name);
LastObsResults = new ObservableCollection<ObsModel>(validSubset);

【讨论】:

    【解决方案3】:

    试试这个:

    var lastObsUpdated = LastObsResults.Except(model => model.ObsName == "Whatever")
                                       .ToList()
                                       .AsObservable();
    

    这将为您创建一个更新后的 ObservableCollection,其中包含除命名项目之外的所有项目。

    【讨论】:

      【解决方案4】:

      如果你想删除所有项目,你可以使用这个:

      LastObsResults .Clear();
      

      如果你想创建自己的扩展方法,你可以这样做:

      public static class ObservableCollectionExtensions
      {
          public static int Remove<T>(
              this ObservableCollection<T> coll, Func<T, bool> condition)
          {
              var itemsToRemove = coll.Where(condition).ToList();
      
              foreach (var item in itemsToRemove)
              {
                  coll.Remove(item);
              }
      
              return itemsToRemove.Count;
          }
      }
      

      使用上面的扩展,您可以删除所有符合通过条件的项目。示例:

      LastObsResults.Remove(x=> x.ObsName == myName);

      最后,您可以使用现有的 collection.Remove() 方法,但请确保您像 described here 一样使用它以避免一个非常常见的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-02
        • 2015-09-07
        • 1970-01-01
        相关资源
        最近更新 更多