"Linq to object"实现以及错误排除

starrycheng 2012-04-20 03:25:11
首先感谢“q107770540”等网友的帮助。

一、"Linq to object"方法实现
public List<ListMenuCatalog> GetRoomLayerBuildingLists()
{
List<ListMenuCatalog> listmenucatalogs = new List<ListMenuCatalog>();
List<RoomLayerBuilding> roomlayerbuildings = this.GetRoomLayerBuildingDatas();
//var listbybuilding = roomlayerbuildings.Distinct(r => r.BuildingNo).ToList();
[color=#FF0000]问题一:“roomlayerbuildings.Distinct(r => r.BuildingNo).ToList()”这样不对么,为什么会出现这样的错误,信息如下?


错误 1 无法将 lambda 表达式 转换为类型“System.Collections.Generic.IEqualityComparer<ServicesEntity.RoomLayerBuilding>”,因为它不是委托类型 C:\Users\Administrator\Desktop\DX4.0\Mycems.BLL\RoomLayerBuildingDatas.cs 59 62 Mycems.BLL


[/color]

//var listbybuilding = (from lb in roomlayerbuildings select roomlayerbuildings.BuildingNo).Distinct();
问题二:“from lb in roomlayerbuildings select roomlayerbuildings.BuildingNo).Distinct()”这样写不对么? 为什么会出现这样的错误,信息如下?

错误 1 “System.Collections.Generic.List<ServicesEntity.RoomLayerBuilding>”不包含“BuildingNo”的定义,并且找不到可接受类型为“System.Collections.Generic.List<ServicesEntity.RoomLayerBuilding>”的第一个参数的扩展方法“BuildingNo”(是否缺少 using 指令或程序集引用?) C:\Users\Administrator\Desktop\DX4.0\Mycems.BLL\RoomLayerBuildingDatas.cs 60 91 Mycems.BLL



return listmenucatalogs;
}


问题三:如果从“roomlayerbuildings”集合中筛选出“DpRoomNo”、“RoomName”两个属性字段不重复的的结果集,应该怎样写?


问题四:“var query3=room.Where(r=>r.DpRoomNo=="001").ToList();”返回的是一个“List”,要获取其中的值,还要将“Var query3”转化为“List”集合,然后获取第一个是么?还有其它好的方法么?



完整实体类:
public class RoomLayerBuilding : INotifyPropertyChanged
{
public RoomLayerBuilding() { }




/// <summary>
/// 房间编号
/// </summary>
public String DpRoomNo
{
get
{
return _dproomno;
}
set
{
_dproomno = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("DpRoomNo"));
}
}


/// <summary>
/// 房间名称
/// </summary>
public String RoomName
{
get
{
return _dproomname;
}
set
{
_dproomname = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("RoomName"));
}
}


/// <summary>
/// 楼层编号
/// </summary>
public String LayerNo
{
get
{
return _dplayerno;
}
set
{
_dplayerno = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("LayerNo"));
}
}


/// <summary>
/// 建筑编号
/// </summary>
public String BuildingNo
{
get
{
return _dpbuildingno;
}
set
{
_dpbuildingno = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("BuildingNo"));
}
}


/// <summary>
/// 建筑名称
/// </summary>
public String BuildingName
{
get
{
return _dpbuildingname;
}
set
{
_dpbuildingname = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("BuildingName"));
}
}







#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion

String _dproomno;
String _dproomname;
String _dplayerno;
String _dpbuildingno;
String _dpbuildingname;

}
...全文
158 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
starrycheng 2012-05-13
  • 打赏
  • 举报
回复
要写一篇博客总结下“Linq”的使用了啊。。。
starrycheng 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

http://topic.csdn.net/u/20101111/09/ea049af5-d079-4a13-8c1d-e1a3350a830d.html
[/Quote]

3KS
starrycheng 2012-05-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

C# code


//问题2
var listbybuilding = (from lb in roomlayerbuildings select lb.BuildingNo).Distinct();
//其实等价于:
var listbybuilding = roomlayerbuildings.Select(lb=> lb.BuildingNo).Distinct();


问题3: 参……
[/Quote]

敢问大侠,有关于“Linq to object”、“Linq to SQL”、“Linq to EF”、“Linq to DataSet”的资料没???

主要是要熟悉“语法和函数”,谢谢了。。。
starrycheng 2012-05-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

C# code


//问题2
var listbybuilding = (from lb in roomlayerbuildings select lb.BuildingNo).Distinct();
//其实等价于:
var listbybuilding = roomlayerbuildings.Select(lb=> lb.BuildingNo).Distinct();


问题3: 参……
[/Quote]

顶一下。。。
q107770540 2012-04-29
  • 打赏
  • 举报
回复


//问题2
var listbybuilding = (from lb in roomlayerbuildings select lb.BuildingNo).Distinct();
//其实等价于:
var listbybuilding = roomlayerbuildings.Select(lb=> lb.BuildingNo).Distinct();


问题3: 参考 http://blog.csdn.net/q107770540/article/details/5784646

问题4: 如果只想获取第一个,可以这样:

var query3=room.FirstOrDefault(r=>r.DpRoomNo=="001");

q107770540 2012-04-29
  • 打赏
  • 举报
回复
1.vroomlayerbuildings.Distinct(r => r.BuildingNo).ToList();
返回的是由BuildingNo值组成的int数组(BuildingNo类型是int)
你如果想返回ListMenuCatalog类型的数组,可以这样:
  var listbybuilding = roomlayerbuildings.GroupBy(r => r.BuildingNo).Select(g=>g.First()).ToList();  
starrycheng 2012-04-29
  • 打赏
  • 举报
回复
完整的代码是这样的么:

1、实体类

namespace ServicesEntity
{
public class RoomLayerBuilding : INotifyPropertyChanged, IEqualityComparer<RoomLayerBuilding>
{
public RoomLayerBuilding() { }




/// <summary>
/// 房间编号
/// </summary>
public String DpRoomNo
{
get
{
return _dproomno;
}
set
{
_dproomno = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("DpRoomNo"));
}
}


/// <summary>
/// 房间名称
/// </summary>
public String RoomName
{
get
{
return _dproomname;
}
set
{
_dproomname = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("RoomName"));
}
}


/// <summary>
/// 楼层编号
/// </summary>
public String LayerNo
{
get
{
return _dplayerno;
}
set
{
_dplayerno = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("LayerNo"));
}
}


/// <summary>
/// 建筑编号
/// </summary>
public String BuildingNo
{
get
{
return _dpbuildingno;
}
set
{
_dpbuildingno = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("BuildingNo"));
}
}


/// <summary>
/// 建筑名称
/// </summary>
public String BuildingName
{
get
{
return _dpbuildingname;
}
set
{
_dpbuildingname = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("BuildingName"));
}
}


public bool Equals(RoomLayerBuilding x, RoomLayerBuilding y)
{
return (x.BuildingNo.Trim() == y.BuildingNo.Trim() && x.BuildingName.Trim() == y.BuildingName.Trim());
}

public int GetHashCode(RoomLayerBuilding obj)
{
return obj.BuildingNo.GetHashCode() ^ obj.BuildingName.GetHashCode();
}




#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion

String _dproomno;
String _dproomname;
String _dplayerno;
String _dpbuildingno;
String _dpbuildingname;

}
}


Enumerable<RoomLayerBuilding> roomlayerbuildings = this.GetRoomLayerBuildingDatas().Distinct(new RoomLayerBuilding());

foreach (var item in roomlayerbuildings)
{
ListMenuCatalog lmc = new ListMenuCatalog();
lmc.CatalogName = item;

}
return listmenucatalogs;

2、处理数据集

Enumerable<RoomLayerBuilding> roomlayerbuildings = this.GetRoomLayerBuildingDatas().Distinct(new RoomLayerBuilding());

foreach (var item in roomlayerbuildings)
{
ListMenuCatalog lmc = new ListMenuCatalog();
lmc.CatalogName = item;

}
return listmenucatalogs;

问题一:“ Enumerable<RoomLayerBuilding> ”这一个提示错误,信息如下:

错误
1 非泛型 类型“System.Linq.Enumerable”不能与类型实参一起使用
C:\Users\Administrator\Desktop\DX4.0\Mycems.BLL\RoomLayerBuildingDatas.cs
65 13
Mycems.BLL

问题二:实体类“RoomLayerBuilding”直接继承“IEqualityComparer<RoomLayerBuilding>”,这个可以么? 还需不需要重新创建一个“RoomLayerBuildingComparer”类???

问题三:“var roomlayerbuildings = this.GetRoomLayerBuildingDatas().Select(rlb => rlb.BuildingNo).Distinct().ToList();”这样可以筛选数据么?

var roomlayerbuildings = this.GetRoomLayerBuildingDatas().Select(rlb => rlb.BuildingNo).Distinct().ToList();

foreach (var item in roomlayerbuildings)
{
ListMenuCatalog lmc = new ListMenuCatalog();
lmc.CatalogName = item.BuildingName;

}

问题:提示“string”不包含"BuildingName"的定义,为什么???

错误信息如下:
错误 1 “string”不包含“BuildingName”的定义,并且找不到可接受类型为“string”的第一个参数的扩展方法“BuildingName”(是否缺少 using 指令或程序集引用?) C:\Users\Administrator\Desktop\DX4.0\Mycems.BLL\RoomLayerBuildingDatas.cs 66 40 Mycems.BLL

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧