Linq запрос для множественного выбора

226
01 октября 2017, 23:22

Есть коллекция

List<Plane> planesAll = PlaneCollection.GetPlane();

Выбранная позиция с события

selectedPlaneBR = planes[e.Position].BR;

Так вот данный BR в коллекции может быть от 1.0 до 10.0 и варианты могут быть 1.0, 1.3, 1.7, 2.0, 2.3, 2.7, 3.0 и т.д. до 10.0. Надо сделать так, чтобы при выборе пользователя варианта, LINQ возвратил все объекты коллекции с разбросом +-1. То есть при выборе 2.3 надо вернуть коллекцию, в которой будут все элементы от 1.3 до 3.3. Данная коллекция передается в ListView. Мой метод:

var planevar = 
    from p in planesAll
    where p.BR==selectedPlaneBR
    select p; 
planespotential = planevar.ToList<Plane>();

Как сделать чтобы выполнялись все условия и возвращался результат, который можно записать в .ToList<T>() ?

Answer 1

Думаю, что достаточно внести изменения в условие выборки и вы получите необходимый результат. К примеру так:

var planevar = 
    from p in planesAll
    where (p.BR >= (selectedPlaneBR - 1)) && (p.BR <= (selectedPlaneBR + 1))
    select p; 

То есть выбрать элементы в интервале selectedPlaneBR +-1, на всякий случай условия заключил в скобки для ясности. Полезные ссылки для ознакомления:

  • Basic LINQ Query Operations (C#)
  • Query Syntax and Method Syntax in LINQ (C#)

Вторую ссылку дал, потому что считаю Method Syntax более удобным, чем Query Syntax. Посмотрите, почитайте, думаю не помешает. Для примера:

var planevar = planesAll
    .Where(p => p.BR >= (selectedPlaneBR - 1) && p.BR <= (selectedPlaneBR + 1))
    .ToList(); 
Answer 2
using System;
using System.Collections.Generic;
using System.Linq;
namespace Planes.Linq.Example
{
    class Program
    {
        static void Main(string[] args)
        {
            var planesAll = new List<Plane>()
            {
                new Plane() { BR = 1.7 },
                new Plane() { BR = 2.0 },
                new Plane() { BR = 2.3 },
                new Plane() { BR = 2.7 },
                new Plane() { BR = 3.0 },
                new Plane() { BR = 3.3 },
                new Plane() { BR = 3.7 },
                new Plane() { BR = 4.0 },
                new Plane() { BR = 4.3 },
                new Plane() { BR = 4.7 },
                new Plane() { BR = 5.0 },
            };
            double selectedPlaneBR = 3.0;
            double step = 1.0;
            var selectedPlanes =
                from p in planesAll
                where p.BR <= selectedPlaneBR + step && p.BR >= selectedPlaneBR - step
                select p;
            foreach (var item in selectedPlanes)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
    }
    public class Plane
    {
        public double BR { get; set; }
        public override string ToString()
        {
            return BR.ToString();
        }
    }
}
READ ALSO
Не возращает string

Не возращает string

Использую код импорта:

235
Разделение программы на модули (C# winforms)

Разделение программы на модули (C# winforms)

Скажите пожалуйста можно ли разделить программу на модули

237
Не удалось загрузить файл или сборку &ldquo;MathParser.org-mXparser.Net46&rdquo;

Не удалось загрузить файл или сборку “MathParser.org-mXparser.Net46”

Здравствуйте, скажите пожалуйста, что я делаю не так?

278
Вывод нуля после запятой TextView

Вывод нуля после запятой TextView

ЗдравствуйтеЧерез вот такой метод, элементу TextView присваивается значение

315