如何在对象或结构列表中获取不同的项目值?

时间:2012-01-04 05:43:41

标签: c# .net

我有一个清单。此集合包含一个包含类属性的对象。 我想要一个关于类的任何特定属性的明确的列表值。我附上了一些示例代码;请检查&如果你们有任何解决方案,请告诉我们:

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.    
}

你能建议我这样做吗?

4 个答案:

答案 0 :(得分:3)

尝试这种方法。

var distinct = lstTest.GroupBy(item => item.lastname).Select(item => item.First()).ToList();

答案 1 :(得分:0)

如果您只需要为一个媒体资源执行此操作,请覆盖Equals中的GetHashCodeTest方法。这些是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();
}

这将是: 乔 吉姆