如何使用Linq </rectangle []>从List <rectangle []>中选择一个矩形

时间:2011-01-04 13:38:45

标签: c# arrays linq list linq-to-objects

我有DrawObject[]的列表。每个DrawObject都有Rectangle属性。这是我的活动:

List<Canvas.DrawObject[]> matrix;

void Control_MouseMove ( object sender, MouseEventArgs e )
{
    IEnumerable<Canvas.DrawObject> tile = Enumerable.Range( 0, matrix.Capacity - 1)
                                          .Where(row => Enumerable.Range(0, matrix[row].Length -1)
                                                 .Where(column => this[column, row].Rectangle.Contains(e.Location)))
                                          .????;
}

我不确定我的最终选择命令应该代替“????”。另外,我收到了一个错误:cannot convert IEnumerable<int> to bool

我已经阅读了几个关于在数组列表上执行linq查询的问题,但是我不能完全理解这个问题。有帮助吗?

修改
对我的实施意图不清楚表示歉意。

我打算选择当前包含鼠标位置的DrawObject

3 个答案:

答案 0 :(得分:4)

一点也不清楚你要做什么。我怀疑你想要的东西如下:

var drawObjects = from array in matrix
                  from item in array
                  where item.Rectangle.Contains(e.Location)
                  select item;

......但也许不是。您尚未显示您要对查询结果执行的操作,或this[column, row]的用途。

您几乎肯定不想首先使用列表的容量 - 您更有可能对Count感兴趣,但使用列表因为IEnumerable<T>可能更好。

编辑:好的,所以上面的查询找到 all 矩形包含给定位置的drawObjects。您几乎肯定希望使用FirstFirstOrDefaultSingleSingleOrDefault之类的内容。例如:

var drawObject = (from array in matrix
                  from item in array
                  where item.Rectangle.Contains(e.Location)
                  select item)
                 .SingleOrDefault();

if (drawObject != null) // We found one
{
     ...
}

答案 1 :(得分:1)

var tile = matrix.SelectMany(x => x)
                 .Where(x => x.Rectangle.Contains(e.Location));

答案 2 :(得分:0)

也许:

....Select(y => y);

但很难真正说出你在做什么。并且您的第一个Where子句将不起作用,因为子句中的lambda表达式必须导致bool,但您的lambda表达式导致IEnumerable<T>。如果我没错。