私は2つのリストのデータセットを持っていますが、どちらのリストでも一貫性のあるIDがありますが、異なるかもしれないし違うかもしれない他のプロパティもあります。 1つ以上のプロパティに基づいて異なるものを最も効率的に取得するにはどうすればよいですか?C#でオブジェクトの2つの大きなリストのプロパティを効率的に比較するにはどうすればよいですか?
私の通常のアプローチはこれに沿ったものでした。私のオブジェクトは次のように設定されています:
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public bool IsEqual(Person other)
{
if (Name != other.Name)
{
return false;
}
if (Age != other.Age)
{
return false;
}
return true;
}
}
ここで、IsEqualコンパレータを使用して、それと同等のオブジェクトを比較します。修正の人を見つけるための私の方法は以下のようであるその後、
そして:私のデータセットでは
public static List<Person> FindModifiedPeople(List<Person> listA, List<Person> listB)
{
var modifiedPeople = new List<Person>();
foreach (var personA in listA)
{
var matchingPerson = listB.FirstOrDefault(e => e.ID == personA.ID);
if (matchingPerson == null)
{
continue;
}
if (!personA.IsEqual(matchingPerson))
{
modifiedPeople.Add(personA);
}
}
return modifiedPeople;
}
、私はListBの中にいる人ではなくLISTA気にしないので、私はをループする必要はありません。両方のリスト。リストBの要素をlistAでチェックするだけで、リストAの要素を使って変更された人のリストを返すことができます。
このアプローチは、合理的に小さいリストではうまくいきましたが、現在は約160,000人のリストが2つあり、このアプローチには数分かかります。この方法をより効率的にする方法はありますか?それでも必要なものを返すのですか?
あなたはありますかリストを使用するには?あなたがその人のIDを持っていれば、辞書のようなものにそれらを保管することができないでしょうか? –
本当に一緒にリストを比較する必要はありますか?なぜ、オブジェクトが更新されていればそのオブジェクト内を追跡し、それをブール値のプロパティとして公開しないでください(つまり、 '' person.IsDirty')? – DavidG
私は今、 'person.IsDirty'が最良の命名規則ではないかもしれないことに気づいています... – DavidG