可以使用的扩展方法和泛型类型的功率编写一个通用的扩展方法来获得每一个列表(Of T)已截然不同的结果:
VB
Dim objects = New List(Of TestObject)()
objects.Add(New TestObject(1, "Test1"))
objects.Add(New TestObject(1, "Test2"))
objects.Add(New TestObject(1, "Test3"))
objects.Add(New TestObject(2, "Test4"))
objects.Add(New TestObject(2, "Test5"))
objects.Add(New TestObject(2, "Test6"))
Dim t As List(Of Integer) = objects.GetDistict(Of Integer, TestObject)("Zone")
Public Class TestObject
Public Property Zone As Integer
Public Property Address As String
Public Sub New(z As Integer, a As String)
Zone = z
Address = a
End Sub
End Class
Public NotInheritable Class DistinctExtension
Private Sub New()
End Sub
<System.Runtime.CompilerServices.Extension> _
Public Shared Function GetDistict(Of T, S)(source As List(Of S), name As String) As List(Of T)
Return source.[Select](Function(x) DirectCast(x.[GetType]().GetProperty(name).GetValue(x), T)).Distinct().ToList()
End Function
End Class
C#
var objects = new List<TestObject>();
objects.Add(new TestObject(1,"Test1"));
objects.Add(new TestObject(1,"Test2"));
objects.Add(new TestObject(1,"Test3"));
objects.Add(new TestObject(2,"Test4"));
objects.Add(new TestObject(2,"Test5"));
objects.Add(new TestObject(2,"Test6"));
List<int> t = objects.GetDistict<int, TestObject>("Zone");
public static class DistinctExtension
{
public static List<T> GetDistict<T,S>(this List<S> source, string name)
{
return source.Select(x => (T)x.GetType().GetProperty(name).GetValue(x)).Distinct().ToList();
}
}
public class TestObject
{
public int Zone { get; set; }
public string Address { get; set; }
public TestObject(int zone, string address)
{
Zone = zone;
Address = address;
}
}
传递表达式作为参数传递给函数 – 2014-12-13 09:16:55
我想你可以使用[动态查询库(http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using- the-linq-dynamic-query-library)。 – Leo 2014-12-13 09:26:08