Как выбрать прямоугольник из спискас Линком - PullRequest
2 голосов
/ 04 января 2011

У меня есть список 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 для списка массивов, но я не совсем понимаю, что с этим не так. Любая помощь?

Edit:
Извиняюсь за то, что не был ясен в моих намерениях с реализацией.

Я намереваюсь выбрать DrawObject, который в настоящее время содержит местоположение мыши.

Ответы [ 3 ]

4 голосов
/ 04 января 2011

Не совсем понятно, что вы пытаетесь сделать. Я подозреваю Вы хотите что-то вроде:

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

... но, возможно, нет. Вы не показали, что вы пытаетесь сделать с результатом запроса, или для чего нужен this[column, row].

Вы почти наверняка не хотите использовать емкость списка в первую очередь - более вероятно, что вы заинтересованы в Count, но используете список как IEnumerable<T> вероятно лучше в любом случае.

РЕДАКТИРОВАТЬ: Хорошо, поэтому вышеприведенный запрос находит все drawObjects, где прямоугольник содержит указанное местоположение. Вы почти наверняка хотите использовать что-то вроде First, FirstOrDefault, Single или SingleOrDefault. Например:

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 голос
/ 04 января 2011
var tile = matrix.SelectMany(x => x)
                 .Where(x => x.Rectangle.Contains(e.Location));
0 голосов
/ 04 января 2011

Может быть:

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

Но трудно действительно сказать, что вы делаете.И ваше первое предложение Where не будет работать, поскольку лямбда-выражение в предложении должно приводить к bool, но ваше лямбда-выражение приводит к IEnumerable<T>.Если я не все не прав.

...