2

我正在尝试在列表中使用 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");
        }
4

2 回答 2

3

听起来您只想实现IEqualityComparer<ActivitiesActivity>

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))

一旦创建了相等比较器,就可以将它用于各种事物,例如以活动为键的字典、像DistinctandJoin等LINQ 操作。

于 2015-03-19T13:56:58.320 回答
-1

Contains您可以使用 LINQAny扩展方法编写自己的代码:

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

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

YourCompareMethod应该看起来像:

private bool YourCompareMethod(CommitItem a, CommitItem b)
{
    // do your comparison
}
于 2015-03-19T13:54:04.233 回答