Пользовательский содержит для списка<ReferenceObject> C#

Я пытаюсь использовать List.Contains в List. Мои объекты для сравнения взяты из Service Reference в 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");
        }

2 ответа

Решение

Вы можете написать свой собственный Contains используя LINQ Any метод расширения:

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

Any проверит, приведет ли какой-либо вызов к лямбда-выражению true,

Ваш YourCompareMethod должен выглядеть так:

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

Похоже, вы просто хотите реализовать 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))

После того, как вы создали средство сравнения равенства, вы можете использовать его для всех видов вещей, таких как словари с действием в качестве ключа, операции LINQ, такие как Distinct а также Join, так далее.

Другие вопросы по тегам