我有两个列表,它们看起来像
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
作为参数。