【问题标题】:Custom Contains for List<ReferenceObject> c#自定义包含 List<ReferenceObject> c#
【发布时间】:2015-05-22 16:12:09
【问题描述】:

我正在尝试在列表中使用 List.Contains 我要比较的对象来自 C# 中的服务引用,它们的 Equals 方法不适合我的需要。

我一直在研究 IEquatables 或如何在我“给定”的对象中覆盖我的 Equals 方法,但我似乎找不到解决方案。 有人知道一种有效的方法吗?

public void FilterNonExisting(List<ActivitiesActivity> commitActivitiesList)
    {
        // ActivitiesActivity is the object I'm given through a reference
        List<int> itemsToDelete = new List<int>();
        int commitCount = 0;

        foreach (ActivitiesActivity commitItem in commitActivitiesList)
        {
            if (this.logList.Contains(commitItem)) // this is the part that doesn't work the way I want it to                {
                itemsToDelete.Add(commitCount);
            }
            commitCount++;
        }
        itemsToDelete.Reverse();
        foreach (int item in itemsToDelete)
            commitActivitiesList.RemoveAt(item);
        if (commitActivitiesList.Count == 0)
        {
            throw new AllCommitedException("All lines had already been committed");
        }

【问题讨论】:

    标签: c# list reference contains iequatable


    【解决方案1】:

    听起来你只想实现IEqualityComparer&lt;ActivitiesActivity&gt;

    public class ActivitiesActivityEqualityComparer
        : IEqualityComparer<ActivitiesActivity>
    {
        public bool Equals(ActivitiesActivity x, ActivitiesActivity y)
        {
            ...
        }
    
        public int GetHashCode(ActivitiesActivity activity)
        {
            ...
        }
    }
    

    然后:

    // Reuse this for multiple calls
    var equalityComparer = new ActivitiesActivityEqualityComparer();
    ...
    if (this.logList.Contains(commitItem, equalityComparer))
    

    创建相等比较器后,您可以将其用于各种事情,例如以活动为键的字典、DistinctJoin 等 LINQ 操作等。

    【讨论】:

      【解决方案2】:

      您可以使用 LINQ Any 扩展方法编写自己的 Contains

      if (this.logList.Any(x => YourCompareMethod(x, commitItem)))
      { }
      

      Any 将检查对 lambda 表达式的任何调用是否会导致 true

      您的YourCompareMethod 应如下所示:

      private bool YourCompareMethod(CommitItem a, CommitItem b)
      {
          // do your comparison
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-20
        • 1970-01-01
        • 2017-04-08
        • 2023-01-09
        • 2020-06-16
        • 2016-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多