Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
.NET 4.x

Перебор списка и выборка на основе метода

29.01.2016, 19:23. Показов 1148. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу подсказать советом, в какую сторону копать или гуглить по форуму
Имеется 1000 точек. Предположим:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Point
{
     public Double X { get; set; }
     public Double Y { get; set; }
     public Double Z { get; set; }
 
     public Point(Double _x, Double _y, Double _z)
      {
          X = _x;
          Y = _y;
          Z = _z;
      }
}
В некоем цикле надо перебрать их все и на основании другого метода отсеять неподходящие.
Сортировка такая: берём первую точку, сравниваем со второй, условие не выполнено. Берём первую точку, сравниваем с третьей, условие выполнено => добавляем точки в результирующий массив и начинаем заново перебор с последней взятой, тоесть с третьей точкой: берем третью точку, сравниваем с четвертой, условие выполнено => добавляем четвёртую точку. И снова выборка, начиная с последней добавленной в результирующий массив.
Есть ли какие подходящие алгоритмы для такого?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.01.2016, 19:23
Ответы с готовыми решениями:

Перебор списка на основе динамического массива
uses System.Collections; type TDynamicArray = class(IEnumerable) private _A: array of integer; _Count, _Capacity:...

выборка данных в таблицу на основе списка
Уважаемые Гуру, нуждаюсь в вашей помощи Задача следующая, в базе данных необходимо, сделать форму в которой с одной стороны будет список...

Пример использование стека на основе массива и на основе двунаправленного списка
здраствуте, можете привести примеры использывания стека на основе массива(1 код) и стек на основе двунаправленного списка(2...

13
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.01.2016, 19:29
Цитата Сообщение от skilllab Посмотреть сообщение
условие
Условие всегда одно и то же? Вероятно что да, так почему бы не использовать LINQ и Where?
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
29.01.2016, 19:33  [ТС]
условие всегда одно и то же.

Ну вот начал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 public void Sort(List<Point> points)
        {
            List<Point> resultArray = new List<Point>();
            Int32 i = 0;
            Int32 j = 1;
            while (i < 1000)
            {
                if (SomeSortingMethod(points[i], resultArray[j]))
                {
                    resultArray.Add(points[i]);
                    i++;
                    j++;
                }
                else
                {
                    //не знаю
                }
            }
        }
Добавлено через 1 минуту
Краем уха услышал что можно применить какое то красно-черное дерево. Туда ли копать?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.01.2016, 19:34
Цитата Сообщение от skilllab Посмотреть сообщение
можно применить какое то красно-черное дерево.
Так я не понял, чем штатные средства не подходят? Скорость не устраивает?
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
29.01.2016, 19:39  [ТС]
Да я даже не пойму как отсортировать (логика в коде) ))) Потому и пишу на форум.

Добавлено через 3 минуты
Т.е. каждая новая выборка (если условие выполнено) при переборе должна начинаться с той позиции, где закончилась предыдущая.
Каждая новая выборка (если условие не выполнено) должна сохранять начальную позицию и сравниваться с
i+1
пока не будет выполнено условие.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.01.2016, 19:47
skilllab, не пойму, зачем такие условия? Скорость штатного перебора не устраивает?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication4 {
    class Program {
        static void Main(string[] args) {
            List<Point> points = new List<Point> {
                new Point{X=1, Y=3, Z=3},
                new Point{X=0, Y=3, Z=3},
                new Point{X=1, Y=3, Z=3}
            };
            var result = points.Where(p => PointComparer(p));
        }
        static bool PointComparer(Point p) {
            //Тут условие выборки объекта...
            return true;
        }
    }
    class Point {
        public int X { get; set; }
        public int Y { get; set; }
        public int Z { get; set; }
    }
}
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
29.01.2016, 19:48  [ТС]
Берём точку A, сравниваем с B = >условие выполнено, добавляем B в результирующий лист. Новая выборка. Берем точку B сравниваем с С = > условие выполнено, добавляем в результирующий массив. Новая выборка. Берём точку С, сравниваем с D => условие не выполнено. Новая выборка. Берем точку С и сравниваем с E = > условие не выполнено. Новая выборка. Берем точку С и сравниваем с F => условие выполнено, добавляем в результирующий массив. Новая выборка....
Миниатюры
Перебор списка и выборка на основе метода  
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
29.01.2016, 19:52  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
зачем такие условия?
Я вот сейчас более наглядно описал. Ну...такие условия)))

Добавлено через 1 минуту
А, ну и точка A автоматом попадает в результирующий массив, как стартовая.

Добавлено через 1 минуту
Цитата Сообщение от insite2012 Посмотреть сообщение
PointComparer
в нём вся загвоздка. Туда нужно не по порядку точки посылать, а по определённой логике.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
29.01.2016, 20:11
Цитата Сообщение от skilllab Посмотреть сообщение
в нём вся загвоздка. Туда нужно не по порядку точки посылать, а по определённой логике.
Так определите ее, эту логику. Я же только прототип показал, я не знаю какой она должна быть, эта самая логика)))

Добавлено через 15 минут
skilllab, может еще вот так пойдет.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication4 {
    class Program {
        static void Main(string[] args) {
            List<Point> points = new List<Point> {
                new Point{X=1, Y=3, Z=3},
                new Point{X=0, Y=3, Z=3},
                new Point{X=1, Y=3, Z=3}
            };
            List<Point> sorted = GetPoints(points, (p) => (p.X == 1 && p.Y == 3 && p.Z == 3)).ToList();            
        }
        static IEnumerable<Point> GetPoints(List<Point> points, Func<Point, bool> comparer) {
            foreach (Point pt in points) {
                if (comparer(pt)) {
                    yield return pt;
                }
            }
        }
    }
    class Point {
        public int X { get; set; }
        public int Y { get; set; }
        public int Z { get; set; }
    }
}
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.01.2016, 22:37
Цитата Сообщение от skilllab Посмотреть сообщение
В некоем цикле надо перебрать их все и на основании другого метода отсеять неподходящие.
Сортировка такая: берём первую точку, сравниваем со второй, условие не выполнено. Берём первую точку, сравниваем с третьей, условие выполнено => добавляем точки в результирующий массив и начинаем заново перебор с последней взятой, тоесть с третьей точкой: берем третью точку, сравниваем с четвертой, условие выполнено => добавляем четвёртую точку. И снова выборка, начиная с последней добавленной в результирующий массив.
Есть ли какие подходящие алгоритмы для такого?
Цитата Сообщение от skilllab Посмотреть сообщение
Берём точку A, сравниваем с B = >условие выполнено, добавляем B в результирующий лист. Новая выборка. Берем точку B сравниваем с С = > условие выполнено, добавляем в результирующий массив. Новая выборка. Берём точку С, сравниваем с D => условие не выполнено. Новая выборка. Берем точку С и сравниваем с E = > условие не выполнено. Новая выборка. Берем точку С и сравниваем с F => условие выполнено, добавляем в результирующий массив. Новая выборка....
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
IEnumerable<Point> Filter(IEnumerable<Point> source, Func<Point, Point, bool> compare)
{
   using (var iter = source.GetEnumerator())
   {
      Point pivot;
      if (iter.MoveNext()) 
         pivot = iter.Current;
      else 
         yield break;
 
      while (iter.MoveNext())
      {
         if (compare(pivot, iter.Current))
         {
            yield return iter.Current;
            pivot = iter.Current;
         }
      }
   }
}
Использование:
C#
1
2
List<Point> points = ...
List<Point> filteredList = Filter(points, SomeSortingMethod).ToList();
1
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
31.01.2016, 15:47  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
if (compare(pivot, iter.Current))
это сравнение по Object? Или по ссылке?

Сам Compare должен быть несколько хитрее. Ибо есть условие. И при новой выборке будет смещение.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.01.2016, 15:53
Цитата Сообщение от skilllab Посмотреть сообщение
это сравнение по Object? Или по ссылке?
Как реализуете.

Цитата Сообщение от skilllab Посмотреть сообщение
Сам Compare должен быть несколько хитрее. Ибо есть условие.
Compare — это ссылка на метод, которую вы передаете вместе с коллекцией. Как реализован метод сравнения — это уже ваше дело.

Цитата Сообщение от skilllab Посмотреть сообщение
И при новой выборке будет смещение.
Оно там есть.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
31.01.2016, 16:27  [ТС]
Всё что показывал выше, суть верно. Задача у меня несколько другая. Я просто выше "упростил"
Пока есть только это:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//Код не совсем корректен
public void Sort(List<Point> points)
        {
            List<Point> resultArray = new List<Point>();
            Int32 i = 0;
            Boolean firstTrue = false;
            Boolean secondTrue = false;
            while (i < 1000)
            {
                Point first = null;
                if (!firstTrue)
                {
                    first = points[i];
                }
 
                Point second = points[i + 1];
                Point third = points[i + 2];
                Point center = GetCircleCenter(first, second, third);
 
 
                if (SomeSortingMethod(first, center, second))
                {
                    resultArray.Add(first);
                    resultArray.Add(second);
                    firstTrue = true;
                }
                if (SomeSortingMethod(second, center, third))
                {
                    resultArray.Add(second);
                    resultArray.Add(third);
                    secondTrue = true;
                }
                if (firstTrue)
                {
                    i = i + 1;
                }
                if (secondTrue)
                {
                    i = i + 1;
                }
            }
        }
Теперь логика:
есть 1000 точек на кривой. Есть начальная (точка отсчёта, тоже лежит на кривой). Берём первую (А), вторую(B), третью точки(C). Ищем центр окружности(O). Далее посылаем в Compare A,O,B - если true = добавляем в resultArray обе точки. Посылаем в Compare B,O,C - если false ничего не делаем.
Теперь, если всё же хоть одну точку добавили, то новая выборка начинается уже с n+(кол-во true возвращённых Compare), т.е. смотря выше по тексту (не по коду, код лишь набросок), i = 2. Если бы оба Compare выдали бы true, то новая выборка пошла бы с i = i+2, и в resultArray попали бы точки B и C. Если бы Compare не вернул ничего, то начальное смещение было бы i = i+2 но в resultArray ничего бы не пошло.

Дам ещё картинку, что именно хочется
Миниатюры
Перебор списка и выборка на основе метода   Перебор списка и выборка на основе метода  
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
31.01.2016, 17:46  [ТС]
Похоже, задача у меня в голове изначально не верно поставлена. Чересчур замудрёный алгоритм.
Бросаю пока это дело, буду по другому логику реализовывать. Спасибо откликнувшимся.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.01.2016, 17:46
Помогаю со студенческими работами здесь

Перебор чисел и выборка определенных
есть 3 комплексных значения Аlfa и 3 значения Beta. Нужно выбрать по одному значению, таких, что A*B=-p/3. Не получается их к double...

Формирование списка + выборка из этого же списка
Сформировать список, состоящий из 5-10 записей в соответствии с вариантом задания: Список личной библиотеки студента: автор,...

Перебор списка
Всем привет. Задача: Перебрать все элементы списка(линейный однонаправленный), так что бы поучаствовали все элементы, но не было повторов...

Перебор списка по индексу
Доброго времени суток. Перебор списка в Python по индексу можно делать иначе чем: for i in range(len(list_int)): ? Есть ли что-то...

Перебор списка списков
Помогите перебрать список списков. Вот так я его формирую static private List&lt;List&lt;int&gt;&gt; Pars(string name) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru