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

等値比較子を作成したら、アクティビティをキーとする辞書、 や などの LINQ 操作など、あらゆる種類のものにそれを使用できDistinctますJoin

于 2015-03-19T13:56:58.320 に答える