2017-01-11 2 views
0

У меня есть этот код:Выбор первого или по умолчанию индекса элемента списка, где свойство в списке соответствует свойству в другом списке?

int index = Convert.ToInt32(PointSeries.XValues.FirstOrDefault(e => this.PointsRects.Any(ep => ep.BottomLeft.X == e))); 

Это возвращает мне деталь в списке PointSeries.XValues где значение х соответствует нижней левой в PointsRects списке. Я хочу, чтобы индекс элемента находился в списке PointSeries.XValues (типа List<double>).

+0

Я смущен от того, что значения в списках, и вы не показали нам, что такое «PointSeriesValues». Если вы ищете «индекс элемента», вы должны использовать ['List.IndexOf()'] (https://msdn.microsoft.com/en-us/library/e4w08k17 (v = vs .110) .aspx), например, «var theIndexInsidePointSeriesValues ​​= PointSeriesValues.IndexOf (index)», где «index» здесь является элементом в коллекции, а не индексом массива/списка (то есть, я думаю, что ваше имя переменной сбивает с толку). – Quantic

+1

Этот вопрос может помочь http://stackoverflow.com/questions/17264281/get-the-index-of-item-in-a-list-given-its-property – niklon

+0

Извините, PointSeries.XValues ​​- это список Hardgraf

ответ

0

Поскольку у вас есть List<T>, вы можете смешать LINQ с конкретным FindIndex способом, специально предусмотренного для этой цели:

int index = PointSeries.XValues.FindIndex(
    e => this.PointsRects.Any(ep => ep.BottomLeft.X == e)); 

возвращаемое значение

от нуля индекс первого вхождения элемента, который соответствует условиям, определенным совпадением, если они найдены; в противном случае -1.

В случае PointRects список большой, то вы можете дополнительно оптимизировать его путем создания HashSet<double> и замена Any с HashSet.Contains:

int index = PointSeries.XValues.FindIndex(
    new HashSet<double>(this.PointsRects.Select(ep => ep.BottomLeft.X)).Contains); 
Смежные вопросы