@dovid זה פשוט מדהים...
אני בזבזתי על זה פונקצייה שלמה:
public static class DistinctByVersionExtensions
{
public static IEnumerable<Lazy<TSource, TSourceMetadata>> DistinctByVersion<TSource, TSourceMetadata>(this IEnumerable<Lazy<TSource, TSourceMetadata>> source, Func<TSourceMetadata, string> idSelector, Func<TSourceMetadata, double> versionSelector)
{
foreach (Lazy<TSource, TSourceMetadata> item in source)
{
string id = idSelector(item.Metadata);
IEnumerable<Lazy<TSource, TSourceMetadata>> same_ids = source.Where(v => idSelector(v.Metadata) == id);
if (same_ids.Any())
{
double ver = versionSelector(item.Metadata);
double max_ver = same_ids.Max(v => versionSelector(v.Metadata));
if (ver == max_ver)
yield return item;
}
else
{
yield return item;
}
}
}
}
ולא חשבתי שזה כל כך פשוט..
אגב, יותר נחמד זה ככה:
.Select(x => x.OrderBy(y => y.version).Last());
במקום:
.Select(x => x.OrderByDescending(y => y.version).First());
ומגרסת 6.0 של NET. אפשר גם ככה:
.Select(x => x.MaxBy(y => y.version));