C#List1.Union(List2) - 自定义比较



我有两个列表,它们看起来像

list1包含

CMD=stopped|ID=1234|TS=2017-06-30 7:19:20|AUF=4711|AG=010|;
CMD=stopped|ID=1111|TS=2017-06-30 7:19:20|AUF=4711|AG=010|;
CMD=stopped|ID=2222|TS=2017-06-30 7:19:20|AUF=4711|AG=010|;
CMD=stopped|ID=3333|TS=2017-06-30 7:19:20|AUF=4711|AG=010|;
CMD=stopped|ID=4444|TS=2017-06-30 7:19:20|AUF=4711|AG=010|;
CMD=stopped|ID=5555|TS=2017-06-30 7:19:20|AUF=4711|AG=010|;

list2包含

CMD=stopped|ID=2222|TS=2017-06-30 8:19:20|AUF=4711|AG=010|Res=saguasgha|Mail=true|;
CMD=stopped|ID=6666|TS=2017-06-30 8:19:20|AUF=4711|AG=010|Res=saguasgha|Mail=true|;

现在,我想将它们合并到一个新列表中,在ID 上称为List3 list2应该用同一ID 替换List1上的条目,因此List3的预期结果是:

CMD=stopped|ID=1234|TS=2017-06-30 7:19:20|AUF=4711|AG=010|;
CMD=stopped|ID=1111|TS=2017-06-30 7:19:20|AUF=4711|AG=010|;
CMD=stopped|ID=2222|TS=2017-06-30 8:19:20|AUF=4711|AG=010|Res=saguasgha|Mail=true|;
CMD=stopped|ID=3333|TS=2017-06-30 7:19:20|AUF=4711|AG=010|;
CMD=stopped|ID=4444|TS=2017-06-30 7:19:20|AUF=4711|AG=010|;
CMD=stopped|ID=5555|TS=2017-06-30 7:19:20|AUF=4711|AG=010|;
CMD=stopped|ID=6666|TS=2017-06-30 8:19:20|AUF=4711|AG=010|Res=saguasgha|Mail=true|;

我知道我可以使用List.Union方法实现这一目标,但是由于这使用了哈希码和字符串不同,因此它不起作用。因此,我只需要比较 ID-字符串的"属性",仅此而已。

我认为我必须覆盖GetHashCode()Equals(),但不知道该怎么做才能获得我的目标。

有什么建议?

谢谢!

(用于提取ID I有一种方法,该方法从给定的字符串中返回ID值,其称为RegExExtraction("ID=",line)(

//编辑:

感谢您的建议,现在这样做了:

        public class MyComparer : IEqualityComparer<string>
        {
            public bool Equals(string line1, string line2)
            {
                return RegExExtraction("ID=", line1) == RegExExtraction("ID=", line2);
            }

            public int GetHashCode(string obj)
            {
                return RegExExtraction("ID=", obj).GetHashCode();
            }
            private string RegExExtraction(string value, string toCheck)
            {
                return Regex.Match(toCheck, string.Format("{0}({1}){2}", Regex.Escape(value), ".+?", Regex.Escape("|"))).Groups[1].Value;
            }
        }
newList = list2.Union(list1, new MyComparer()).ToList();

您应该编写自己的IEqualityComparer<>(顺便说一下,也许是字符串中每个值具有属性的类(。

通过拥有IequalityComparer,您可以致电:

var distinctValues = new HashSet<MyClass>(list1.Concat(list2), MyClassEqualityComparer.Default);

和请请勿覆盖Equals()GetHashCode() 。始终更喜欢自己的IEqualityComparer<>实现,并在需要特殊比较的地方使用它。使用平等比较的几乎每个类或方法都有一些超载,将IEqualityComparer作为参数。

最新更新