3

2 つのリスト (ListAListB) があります。これらのリストのタイプは同じPersonInfoで、Loginフィールドは一意のキーです。

public class PersonInfo
{
    public string Login { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    public bool Active { get; set; }
}

これらの 2 つのリストを比較したいと思います。

  1. ListAで利用できないアイテムのリストを取得したいListB

  2. 両方のリストで利用可能なアイテムのうち、2 つのリストに違いがあるアイテムについてはListA(フィールドは一意のキー)からリストを取得したいと考えています。Login

例: のLogin「MyLogin」ListAの場合、 の値が の値とFirstName一致しませんListB。「MyLogin」を含むアイテムLoginは、結果リストの一部である必要があります。

例 : 特定のログインのAgeListAとの間ListBが異なる場合、項目は結果の一部である必要があります

ありがとう。

4

5 に答える 5

5

IEquatableカスタムデータ型リストのオブジェクトを比較するには、クラスに実装してオーバーライドする必要がありますGetHashCode()

このMSDNリンクを確認してください

あなたのクラス

    public class PersonInfo : IEquatable<PersonInfo>
    {
        public string Login { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
        public bool Active { get; set; }

        public bool Equals(PersonInfo other)
        {
            //Check whether the compared object is null.
            if (Object.ReferenceEquals(other, null)) return false;

            //Check whether the compared object references the same data.
            if (Object.ReferenceEquals(this, other)) return true;

            //Check whether the properties are equal.
            return Login.Equals(other.Login) && FirstName.Equals(other.FirstName) && LastName.Equals(other.LastName) && Age.Equals(other.Age) && Active.Equals(other.Active);
        }

        public override int GetHashCode()
        {

            int hashLogin = Login == null ? 0 : Login.GetHashCode();

            int hashFirstName = FirstName == null ? 0 : FirstName.GetHashCode();

            int hashLastName = LastName == null ? 0 : LastName.GetHashCode();

            int hashAge = Age.GetHashCode();

            int hashActive = Active.GetHashCode();

            //Calculate the hash code.
            return (hashLogin + hashFirstName + hashLastName) ^ (hashAge + hashActive);
        }
    }

次に、これをどのように使用するかを示します(Pranayの回答に記載されています)

            List<PersonInfo> ListA = new List<PersonInfo>() { new PersonInfo { Login = "1", FirstName = "James", LastName = "Watson", Active = true, Age = 21 }, new PersonInfo { Login = "2", FirstName = "Jane", LastName = "Morrison", Active = true, Age = 25 }, new PersonInfo { Login = "3", FirstName = "Kim", LastName = "John", Active = false, Age = 33 } };
            List<PersonInfo> ListB = new List<PersonInfo>() { new PersonInfo { Login = "1", FirstName = "James2222", LastName = "Watson", Active = true, Age = 21 }, new PersonInfo { Login = "3", FirstName = "Kim", LastName = "John", Active = false, Age = 33 } };

            //Get Items in ListA that are not in ListB
            List<PersonInfo> FilteredListA = ListA.Except(ListB).ToList();

            //To get the difference between ListA and FilteredListA (items from FilteredListA will be removed from ListA)
            ListA.RemoveAll(a => FilteredListA.Contains(a));
于 2012-05-30T07:29:21.003 に答える
4

編集

詳細な違いについては、このソリューションを試してください: 2 つのオブジェクトを比較し、違いを見つけます。


方法: 2 つのリストのセットの違いを見つける (LINQ)

Enumerable.Except メソッド (IEnumerable、IEnumerable) - デフォルトの等値比較子を使用して値を比較することにより、2 つのシーケンスの差集合を生成します。

       double[] numbers1 = { 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 };
        double[] numbers2 = { 2.2 };

        IEnumerable<double> onlyInFirstSet = numbers1.Except(numbers2);

また

//newList will include all the common data between the 2 lists
List<T> newList = list1.Intersect(list2).ToList<T>();


//differences will be the data not found 
List<T> differences = list1.RemoveAll(a => newList.Contains(a));

また

外部結合して差を取得する

var compare1to2 = from a in 
           from b in driveList2.Where(b => b.property == a.property).DefaultIfEmpty()
                              select a;
于 2012-05-30T05:33:01.100 に答える
2
var list3 = list1.Except(list2).ToList(); //List3 contains what in list1 but not _list2.
于 2014-12-20T21:50:58.260 に答える
-4

LINQのZip()とIntersect()を使用できます

于 2012-05-30T05:39:17.913 に答える