我有一个RowData
项目列表(自定义类)。
RowData
项目包含CellData
项目列表(另一个自定义类别)。
目前,我可以访问每个CellData
项的唯一方法是通过RowData
的{{1}},这意味着我必须为每次搜索创建一个循环。< / p>
我想要的是创建一个方法,该方法将返回给定this[int index]
值的所有CellData
项:
index
我不喜欢返回private List<RowData> rowList;
public IEnumerable<CellData> Cells(int index) {
foreach (var row in rowList) {
if (row.ID == index) {
return row.AsEnumerable<CellData>();
}
}
return null;
}
,我想知道如何使用一些LINQ技术(either Query or Method syntax)来完成这项任务。
答案 0 :(得分:4)
为了能够使用LINQ语法从行获取单元格集合,您的RowData
需要是可枚举的,即实现IEnumerable
接口。
在您的示例中,我.AsEnumerable<CellData>()
假设您的RowData
已经实现了它,枚举RowData
会返回CellData
个对象的集合。
如果没有,您需要自己在IEnumerable
中实施RowData
。如果您的this[int index]
访问者从集合中读取数据,您只需返回该集合的GetEnumerator
。
然后,您将能够使用LINQ查询从CellData
集合中获取RowData
集合,例如:
var cells = rowList.Where(x => x.ID == index).SelectMany(x => x);
答案 1 :(得分:1)
假设给定索引只返回一行:
public IEnumerable<CellData> Cells(int index)
{
var foundRow = rowList.FirstOrDefault(row => row.ID == index);
//if no row was found, foundRow will be null
if(foundRow != null)
return foundRow.AsEnumerable<CellData>();
else
return new CellData[]; //return empty cells IEnumerable. Could also be new List<CellData>()
}
}
此代码假设foundRow.AsEnumerable<CellData>()
返回IEnumerable<CellData>
。
您必须检查是否存在无效,因为可能也找不到给定索引处的行。
答案 2 :(得分:0)
怎么样:
List<CellData> cells = rowList.Where(x => x.Index == index).SelectMany(x => x.Cells).ToList();
答案 3 :(得分:0)
这将达到相同的效果。
var resultsList = from x in rowList
where x.ID == index
select x;
return resultsList;
答案 4 :(得分:0)
public IEnumerable<CellData> Cells(int index){
var cells = (from r on rowList
where r.ID == index
select r.Cells).FirstOrDefault();
return cells;
}