Ответ 1
Вам понадобится либо использовать обычный тип для проекции, либо сделать метод, по которому вы передаете его, в общий (что будет означать, что вы не можете с ним справиться). Что именно ты пытаешься сделать? Если вам нужно использовать значения X и Y из метода, вам обязательно нужно создать обычный тип. (Есть ужасно хакерские способы избежать этого, но это не очень хорошая идея.)
Примечание: некоторые другие ответы в настоящее время говорят о IQueryable<T>
, но нет никаких указаний на то, что вы используете что-то большее, чем LINQ to Objects, и в этом случае вместо этого будет IEnumerable<T>
, но T
в настоящее время является анонимным типом. Это бит, на котором вам нужно будет работать, если вы хотите использовать отдельные значения в каждом элементе. Если вы не используете LINQ to Objects, проясните вопрос, и я отредактирую этот ответ.
Например, принимая ваш текущий запрос (который немного сломан, так как вы не можете использовать два инициатора инициализации дважды с тем же именем X). Вы должны создать новый тип, например. MyPoint
public sealed class MyPoint
{
private readonly int x;
private readonly int y;
public int X { get { return x; } }
public int Y { get { return y; } }
public MyPoint(int x, int y)
{
this.x = x;
this.y = y;
}
}
Тогда ваш запрос:
var query =
from p in pointList
where p.X < 100
select new MyPoint(p.X, p.Y);
Затем вы должны написать свой метод как:
public void SomeMethod(IEnumerable<MyPoint> points)
{
...
}
И назовите его SomeMethod(query);