DistinctBy
ක්රියාකාරීත්වය ලබා ගැනීම සඳහා ඔබේ ව්යාපෘතියට මෝර්ලින්ක් පුස්තකාලය එක් කිරීමට ඔබට අවශ්ය නැතිනම්, ලින්ක්ගේ Distinct
ක්රමවේදය අධික ලෙස භාවිතා කිරීමෙන් ඔබට එකම අවසාන ප්රති result ලය ලබා ගත හැකිය .IEqualityComparer
.
සාමාන්ය පන්තියේ අවස්ථා දෙකක අභිරුචි සංසන්දනය කිරීම සඳහා ලැම්බඩා සින්ටැක්ස් භාවිතා කරන සාමාන්ය අභිරුචි සමානාත්මතා සංසන්දනාත්මක පන්තියක් නිර්මාණය කිරීමෙන් ඔබ ආරම්භ කරයි:
public class CustomEqualityComparer<T> : IEqualityComparer<T>
{
Func<T, T, bool> _comparison;
Func<T, int> _hashCodeFactory;
public CustomEqualityComparer(Func<T, T, bool> comparison, Func<T, int> hashCodeFactory)
{
_comparison = comparison;
_hashCodeFactory = hashCodeFactory;
}
public bool Equals(T x, T y)
{
return _comparison(x, y);
}
public int GetHashCode(T obj)
{
return _hashCodeFactory(obj);
}
}
ඔබේ ප්රධාන කේතයේ ඔබ එය එසේ භාවිතා කරයි:
Func<Person, Person, bool> areEqual = (p1, p2) => int.Equals(p1.Id, p2.Id);
Func<Person, int> getHashCode = (p) => p.Id.GetHashCode();
var query = people.Distinct(new CustomEqualityComparer<Person>(areEqual, getHashCode));
වොයිලා! :)
ඉහත සඳහන් කරුණු පහත දැක්වේ:
- දේපල
Person.Id
වර්ගයට අයත් වේint
- මෙම
people
එකතුව ඕනෑම ශූන්ය අංග අඩංගු නොවේ
එකතුවට ශුන්ය අඩංගු විය හැකි නම්, ශුන්යය පරීක්ෂා කිරීම සඳහා ලැම්බඩා නැවත ලියන්න, උදා:
Func<Person, Person, bool> areEqual = (p1, p2) =>
{
return (p1 != null && p2 != null) ? int.Equals(p1.Id, p2.Id) : false;
};
සංස්කරණය කරන්න
මෙම ප්රවේශය ව්ලැඩිමීර් නෙස්ටරොව්ස්කිගේ පිළිතුරට සමාන නමුත් සරල ය.
එය ජොයෙල්ගේ පිළිතුරේ ඇති පිළිතුරට සමාන වන නමුත් බහු ගුණාංග සම්බන්ධ සංකීර්ණ සංසන්දනාත්මක තර්කනයකට ඉඩ දෙයි.
කෙසේ වෙතත්, ඔබගේ වස්තූන් පමණක් මෙතෙක් විසින් වෙනස් කළ හැකි නම් Id
එවිට තවත් පරිශීලකයෙකු නිවැරදි පිළිතුර ලබා දුන් ඔබ කළ යුතු සියල්ල පෙරනිමි නිර්මාණයන් යටපත් කිරීම බව GetHashCode()
හා Equals()
ඔබේ Person
පන්තිය හා ඉන්පසු එහි සිදු-of-the-කොටුව භාවිතා Distinct()
පෙරහන Linq ක්රමය ඕනෑම අනුපිටපත්.