问题
I'm trying to use List.Contains in a List My objects to compare come from a Service Reference in C# and their Equals method doesn't suit my needs.
I've been looking into IEquatables or on how to override my Equals method in an objet I'm "given" but I can't seem to find a solution for this. Does some one know an efficient way to do this?
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");
}
回答1:
You could write your own Contains
using the LINQ Any extension method:
if (this.logList.Any(x => YourCompareMethod(x, commitItem)))
{ }
The Any
will check if any call to the lambda expression will result in true
.
Your YourCompareMethod
should look like:
private bool YourCompareMethod(CommitItem a, CommitItem b)
{
// do your comparison
}
回答2:
It sounds like you just want to implement IEqualityComparer<ActivitiesActivity>
:
public class ActivitiesActivityEqualityComparer
: IEqualityComparer<ActivitiesActivity>
{
public bool Equals(ActivitiesActivity x, ActivitiesActivity y)
{
...
}
public int GetHashCode(ActivitiesActivity activity)
{
...
}
}
Then:
// Reuse this for multiple calls
var equalityComparer = new ActivitiesActivityEqualityComparer();
...
if (this.logList.Contains(commitItem, equalityComparer))
Once you've created the equality comparer, you can use that for all kinds of things, such as dictionaries with an activity as the key, LINQ operations like Distinct
and Join
, etc.
来源:https://stackoverflow.com/questions/29146416/custom-contains-for-listreferenceobject-c-sharp