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
----------------
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的.distinct()方法的运用(一个简单的例子)
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 分享实现类似QQ的自动登陆的方法,代码比较简单,主要是给大家提供一个实现逻辑,具体的要结合自身的app来做
- 一个简单的方法实现购物车小球动画
- Java实现一个简单的加密解密方法
- go语言实现一个简单的http客户端抓取远程url的方法
- ADO.Net实现非连接的简单分页方法(DataAdapter.Fill重载中的一个).
- 综合应用WPF/WCF/WF/LINQ之三十八:实现一个简单的DataGrid之总体介绍
- Java实现一个简单的缓存方法
- 一个极为简单的requirejs实现方法
- js一个简单的方法实现数组中元素相加
- 综合应用WPF/WCF/WF/LINQ之三十九:实现一个简单的DataGrid之获取某格的原始(或当前)行(或列)的Index
- c/c++ 使用boost库实现的一个简单判断字符串编码的方法
- 基于一个简单定长内存池的实现方法详解
- 实现一个简单的vue无限加载指令方法
- LAMP的一个简单实现方法
- 一个最为简单的jquery 分页实现方法!可以用用于理解js分页的原理。
- 综合应用WPF/WCF/WF/LINQ之四十:实现一个简单的DataGrid之CheckBox已勾选的项的保存
- 一个IOC简单实现方法