我有一个清单。此集合包含一个包含类属性的对象。 我想要一个关于类的任何特定属性的明确的列表值。我附上了一些示例代码;请检查&如果你们有任何解决方案,请告诉我们:
class Test
{
public string firstname{get;set;}
public string lastname{get;set;}
}
class Usetheaboveclass
{
Test objTest=new Test();
List<Test> lstTest=new List<Test>();
objTest.firstname="test";
objTest.lastname="testing";
//Now i want a distinct value with respect to lastname.if i use
lstTest=lstTest.Distinct().Tolist();
//It will process according to all properties.
}
你能建议我这样做吗?
答案 0 :(得分:3)
尝试这种方法。
var distinct = lstTest.GroupBy(item => item.lastname).Select(item => item.First()).ToList();
答案 1 :(得分:0)
如果您只需要为一个媒体资源执行此操作,请覆盖Equals
中的GetHashCode
和Test
方法。这些是Distinct()
用于定义重复项的内容。
如果您需要为多个属性执行此操作,请定义IEqualityComparer
(此用法记录在此MSDN article中)。
答案 2 :(得分:0)
或者,您可以实现自定义比较器
public class LastNameComparer : IEqualityComparer<Test>
{
public bool Equals(Test x, Test y)
{
if (x == null)
return y == null;
return x.lastname == y.lastname;
}
public int GetHashCode(Test obj)
{
if (obj == null)
return 0;
return obj.lastname.GetHashCode();
}
}
然后,像
一样使用它lstTest = lstTest.Distinct(new LastNameComparer()).ToList();
答案 3 :(得分:0)
您可以使用Distinct
的重载版本。请参阅以下示例代码:
internal class Test
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
internal class LastNameComparer : IEqualityComparer<Test>
{
bool IEqualityComparer<Test>.Equals(Test x, Test y)
{
if (x.LastName == y.LastName)
return true;
return false;
}
int IEqualityComparer<Test>.GetHashCode(Test obj)
{
return 0; // hashcode...
}
}
private static void Main(string[] args)
{
Test objTest = new Test {FirstName = "Perry", LastName = "Joe"};
Test objTest1 = new Test {FirstName = "Prince", LastName = "Joe"};
Test objTest2 = new Test { FirstName = "Prince", LastName = "Jim" };
List<Test> lstTest = new List<Test> {objTest, objTest1, objTest2};
var distinct = lstTest.Distinct(new LastNameComparer()).ToList();
foreach (var test in distinct)
{
Console.WriteLine(test.LastName);
}
Console.Read();
}
这将是: 乔 吉姆