您的位置:首页 > 产品设计 > UI/UE

linq Distinct的一个简单实现方法

2011-12-20 16:25 519 查看
linq Distinct  

IEnumerable<List<Models.ReportName>> query1 = from e in jv
group e by new { e.ReportId } into g
select g.ToList();

这段代码可以得到一个范型的集合(根据reportId分组后的范型集合),通过foreach能够取出进行操作。
foreach (List<ReportName> reportNames in query1)
{
reportNameTemp = new ReportName();
reportNameTemp.ReportList = new List<ReportList>();
foreach (ReportName reportName in reportNames)
{
childReportName = new ReportList();

childReportName.Name = reportName.Name;
reportNameTemp.ReportList.Add(childReportName);
reportNameTemp.ReportSetName = reportName.ReportSetName;
reportNameTemp.ReportId = reportName.ReportId;
}

emptyList.Add(reportNameTemp);
}

参考文章:http://blog.csdn.net/fangxinggood/article/details/6187043

Linq 用来实现集合(List, DataTable等) 的二次操作十分简便,这里介绍下用 Linq 对集合进行 Distinct 操作的几种方法。 

0. 准备数据: 

+
expand sourceview
plain

1. 使用GroupBy:对需要Distinct的字段进行分组,取组内的第一条记录这样结果就是Distinct的数据了。 

view
plain

Console.WriteLine("Distinct1 By: A");  

var query1 = from e in User.GetData()  

             group e by new { e.A } into g  

             select g.FirstOrDefault();  

foreach (var u in query1)  

    Console.WriteLine(u.ToString());  

2. 使用Distinct()扩展方法:需要实现IEqualityComparer接口。 

view
plain

class UserCompare : IEqualityComparer<User>  

{  

    public bool Equals(User x, User y)  

    {  

        return (x.A == y.A && x.B == y.B);  

    }  

  

    public int GetHashCode(User obj)  

    {  

        // return obj.GetHashCode();  

        return obj.ToString().ToLower().GetHashCode();  

    }  

}  

 

view
plain

Console.WriteLine("Distinct2 By: A,B");  

var compare = new UserCompare();  

var query2 = User.GetData().Distinct(compare);  

foreach (var u in query2)  

    Console.WriteLine(u.ToString());  

上面的实现中要注意GetHashCode()方法直接用obj.GetHashCode()的话,Distinct不能正常运行。

 

3. 自定义扩展方法DistinctBy(this IEnumerable source, Func keySelector)

view
plain

public static class MyEnumerableExtensions  

{  

    public static IEnumerable<TSource> DistinctBy<TSource, TKey>  

        (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)  

    {  

        HashSet<TKey> seenKeys = new HashSet<TKey>();  

        foreach (TSource element in source)  

        {  

            if (seenKeys.Add(keySelector(element))) { yield return element; }  

        }  

    }  

}  

 

view
plain

Console.WriteLine("Distinct3 By: A,B,C");  

var query3 = User.GetData().DistinctBy(x => new { x.A, x.B, x.C });  

foreach (var u in query3)  

    Console.WriteLine(u.ToString());  

 

 

运行结果:

A   B   C   D

a2,b1,c1,d1

a1,b2,c1,d1

a1,b1,c1,d1

a1,b1,c2,d1

a1,b1,c1,d2

----------------

Distinct1 By: A

a1,b1,c1,d1

a2,b1,c1,d1

----------------

Distinct2 By: A,B

a1,b1,c1,d1

a2,b1,c1,d1

a1,b2,c1,d1

a1,b1,c2,d1

a1,b1,c1,d2

----------------

Distinct3 By: A,B,C

a1,b1,c1,d1

a2,b1,c1,d1

a1,b2,c1,d1

a1,b1,c2,d1

---------------- 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linq c query 扩展 list
相关文章推荐