Sie können ebenso comparer Klasse wie unten definiert:
public class EqualityComparer : IEqualityComparer<Employee >
{
#region IEqualityComparer<Employee> Members
bool IEqualityComparer<Employee>.Equals(Employee x, Employee y)
{
// Check whether the compared objects reference the same data.
if (Object.ReferenceEquals(x, y))
return true;
// Check whether any of the compared objects is null.
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
return x.Salary == y.Salary;
}
int IEqualityComparer<Employee>.GetHashCode(Employee obj)
{
return obj.Salary.GetHashCode();
}
#endregion
}
und es verwenden, wie unten:
var outval = lst.OrderByDescending(p => p.Id)
.Distinct(new EqualityComparer()).Skip(1).First();
oder tun es ohne gleichermaßen Vergleich (in zwei Linie):
var lst2 = lst.OrderByDescending(p => p.Id).Skip(1);
var result = lst2.SkipWhile(p => p.Salary == lst2.First().Salary).First();
Edit: Wie Ani die mit SQL arbeiten sollte tun: var lst = myDataContext.Employees.AsEnumerable();
aber wenn für kommerzielle Software ist es besser, TSQL zu verwenden oder einen anderen linq Weg zu finden.
Sie wollen die Mitarbeiter finden, der den zweithöchsten Gehalt hat? –
@Ian: Ja, ich möchte zweithöchstes Gehalt mit Linq –