Пользовательский содержит для списка<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
, так далее.