LINQ从TList中选择?

时间:2011-07-08 20:23:15

标签: c# linq

我有一个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)来完成这项任务。

5 个答案:

答案 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;
}