Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Можно ли создать Task и вручную контролировать его свойства типа Status и пр ?

Можно ли ?

Я делаю класс, основная работа которого будет происходить с помощью таймера. А точнее через Task.Delay (ms, token).
Метод толжен вернуть вернуть некий Task, по которому вызывающий класс будет контролировать статус выполняемой задачи. Подпишется через ContinueWith, чтобы отслеживать когда метод завершит работу по ошибке или по команде остановки (через token).

Я конечно могу создать ненужную задачу через

var task = Task.Run ((token)=> { while (!token.IsCancellationRequested) {..... Task.Delay (..., token)} })


Но так ведь будет создана ненужная задача, которая лишь зря займет процессор. Мне нужно как-то создать Task, свойствами которого я смогу управлять в ручном режиме. Чтобы вместо Task.Run я мог вернуть Task, и уже выставлять его свойства в ручном режиме.

Как это можно сделать ? Что-то такое я видел где-то в MSDN, но точно не помню детали.
Ответ: WaspNewCore,



Конструкторов там куча.
Типа -
Task t = new Task( () => { foreach(var path in Directory.GetFiles(dirName))
list.Add(path); } );
Вопрос: Создать модуль класса, описать одно свойство типа "коллекция"

Помогите, пожалуйста, решить задачу(Не могу разобраться, как точно работают property-методы):
Создать модуль класса, в котором описать одно свойство типа "коллекция" и с помощью property- методов выдавать сообщение об ошибке в случае попытки добавить в коллекцию новый элемент со значением, уже имеющимся в коллекции.
Ответ: Я создала две коллекции, одну в модуле, другую в классе, так как иначе не могу понять, какой объект передавать методу property set.
После обработки коллекции в классе, коллекция в модуле не меняется, так как объявлена не глобально.
Как можно соединить в этом плане модуль и класс?
Еще мне сказали, что нужно передавать какой-то параметр в свойство property get, но какой, не знаю.


Главный модуль:
Option Explicit

Sub Tester()
Dim c As New Collection
Dim s As New clsSASS
Dim l As Variant
Dim i As Byte

While l <> "~"
l = InputBox("l", "l")
c.Add l
Set s.addition = c
Wend
For i = 1 To c.Count
MsgBox c.Item(i)
Next i
End Sub



Класс модуля:
Option Explicit

Public pIngd As Collection
Dim m As Byte

Property Get addition() As String
addition = pIngd
End Property

Property Set addition(c As Collection)
For m = 1 To c.Count - 1
If c.Item(m) = c.Item(c.Count) Then
MsgBox "ERROR"
Exit Property
End If
Next m
Set pIngd = c
End Property
Вопрос: Работа со свойством типа коллекция

Всем привет. Не знаю как правильно назвать топик, пардон если выразился некорректно.

Подскажите пожалуйста, как присвоить значение свойству типа List<MyClass>?
Примерно такого вида:

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
// Создаем два класса с нужными свойствами
// Сначала основной
class ItemReview {
    public int id { get; set; }
    public int maxCount { get; set; }
    public List<MoreDetails> details{ get; set; }
}
// Затем вспомогательный
class MoreDetails
{
    public int serialNum { get; set; }
    public string textDesc { get; set; }
}
 
// Теперь где-то определяем значения для экземпляра
        ItemReview ir = new ItemReview();
        MoreDetails md = new MoreDetails();
        
        // То\Сё\Пятое\Десятое
        ir.id = idVar;
        ir.maxCount = maxCountVar;
 
        while(пока что-то происходит - создаем экземпляры класса MoreDetails
                             и добавляем их в свойство ItemReview.details)
        {
        md.serialNum = serialNumVar;
        md.textDesc = textDescVar;
 
        // Как теперь присвоить значение не соображу...
        ir.details = .................?
        }
Ответ: kolorotur, спасибо, но я все еще не понимаю ))

C#
1
ir.details = new List<MoreDetails>();
При таком решении ругается на конструктор.

Сообщение от kolorotur
Но это ли вам нужно, вот в чем вопрос.
Что Вы имеете в виду? Мне нужно чтобы свойство содержало коллекцию. Т.е. в основном классе (пусть это будет "Изделие") я описываю id, created, department и в одном из свойств (вспомогательного класса) перечисляю все "Детали" из которых создано "Изделие" (например, серийный номер и дату создания каждой детали).

Добавлено через 2 минуты
Sanya_sa, спасибо, так работает. Как сам не сообразил.. Конечно же .add, это же коллекция
Вопрос: Какой облачное веб-приложение можно создать?

Здравствуйте! Столкнулась с проблемой... Нужно написать дипломный проект на тему: распределенное облачное веб-приложение на базе Cloud Computing! Никакие идеи в голову не приходят, посоветуйте пожалуйста, какое веб-приложение можно создать? с каким функционалом?
Ответ: Ну если нет цели создать что-то принципиально революционное то может быть распределенное облачное хранилище данных?)
Вопрос: Определить, какие слова и в каком количестве можно создать из букв заданного текста

Здравствуйте! Помогите, пожалуйста решить следующее задание.
Даны некоторый текст и словарь с N слов. Определить, какие слова и в каком количестве можно создать с букв заданного текста.
Возникают проблеми со словарем, не могу никак разобраться, как считать по слову чтобы знать длину каждого слова. Заранее огромное спасибо!)
Ответ:
Сообщение от qwertyush
посоветуйте, пожалуйста, где можно почитать доступное обьяснение деревьев для начинающих программистов
а что надо? я что прав оказался?
Вопрос: Биндинг к свойству типа double + валидация

Я использую для валидации вот такой класс:
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
public abstract class ViewModelBase : INotifyPropertyChanged, IDataErrorInfo
    {
        public event PropertyChangedEventHandler PropertyChanged;
 
        private readonly HashSet<string> PropertiesWithErrors = new HashSet<string>();
 
        protected bool HasValidationErrors { get { return PropertiesWithErrors.Any(); } }
 
        public string this[string propertyName] { get { return Validate(propertyName); } }
 
        public string Error { get { throw new NotImplementedException(); } }
 
        protected virtual string Validate(string propertyName)
        {
            var value = GetType().GetProperty(propertyName).GetValue(this);
            var results = new List<ValidationResult>();
            var context = new ValidationContext(this, null, null) { MemberName = propertyName };
 
            if (!Validator.TryValidateProperty(value, context, results))
            {
                PropertiesWithErrors.Add(propertyName);
                return results.First().ErrorMessage;
            }
 
            PropertiesWithErrors.Remove(propertyName);
            return string.Empty;
        }
 
        protected virtual void RaisePropertyChanged(string pname) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(pname));
 
        protected virtual void Set<T>(string pname, ref T field, T value)
        {
            field = value;
            RaisePropertyChanged(pname);
        }
    }
Нужно только отнаследовать от него ViewModel и создать свойство для биндинга. Это очень удобно, т.к. сразу ясно есть ли ошибки валидации. Но у меня такая проблема. Если у меня свойство типа double то у меня полностью перестают вводиться точки и запятые. Как же мне поставить дробную точку (или запятую)?

Ну например:
C#
1
2
3
4
public class ViewModel : ViewModelBase
{
    public double Value { get; set; }
}
XML
1
<TextBox Text="{Binding Path=Value, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}"/>
Добавлено через 12 часов 25 минут
Кроме того при работе с этой ViewModel-ю перестают работать всякие полезные атрибуты из System.ComponentModel.DataAnnotations аля Range и т.п. Почему так происходит?
Ответ: Dark Byte,

честно говоря, не знаю! с аннотациями еще не работал, все собираюсь за них основательно взяться
Вопрос: Создать коллекцию для хранения объектов типа Автомобиль

В методе , создать коллекцию для хранения объектов типа Автомобиль. Продемонстрировать возможность сортировки содержания коллекции по разным свойствам Автомобиля(по весу, стоимости , производителю) Результаты сортировки вывести на экран.
Ответ:
Кликните здесь для просмотра всего текста
Java(TM) 2 Platform Standard Edition 5.0
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
 
public class CollectionTask {
    CollectionTask() {
        Car car1 = new Car("Opel", 2.50, 300.0);
        Car car2 = new Car("Audi", 6.50, 120.0);
        Car car3 = new Car("BMW", 1.30, 600.0);
        List<Car> carList = new ArrayList<Car>();
        carList.add(car1);
        carList.add(car2);
        carList.add(car3);
        printer(carList);
        System.out.println();
        Collections.sort(carList, new Car(0));
        printer(carList);
        System.out.println();
        Collections.sort(carList, new Car(1));
        printer(carList);
        System.out.println();
        Collections.sort(carList, new Car(2));
        printer(carList);
        System.out.println();
    }
 
    private void printer(List<Car> carList) {
        for (Car car : carList) {
            System.out.println("Manufacturer: " + car.manufacturer
                    + ", price: " + car.price + ", weight: " + car.weight);
        }
    }
 
    public static void main(String[] args) {
        new CollectionTask();
    }
 
    private class Car implements Comparator<Object> {
        double weight;
        double price;
        String manufacturer;
        int sortType;
 
        public Car(int sortType) {
            this.sortType = sortType;
        }
 
        public Car(String manufacturer, double price, double weight) {
            this.manufacturer = manufacturer;
            this.price = price;
            this.weight = weight;
        }
 
        @Override
        public int compare(Object o1, Object o2) {
            Car car1 = (Car) o1;
            Car car2 = (Car) o2;
            if (sortType == 0) {
                return car1.manufacturer.compareTo(car2.manufacturer);
            } else if (sortType == 1) {
                return car1.price < car2.price ? 1
                        : car1.price > car2.price ? -1 : 0;
            } else if (sortType == 2) {
                return car1.weight < car2.weight ? 1
                        : car1.weight > car2.weight ? -1 : 0;
            }
            return 0;
        }
    }
}
Вопрос: Создать класс Табуретка со свойствами

Создать класс Табуретка со свойствами: Высота (h, в см), Качествоизделия (низкое, среднее, высокое). Определить два виртуальных метода: «количество древесины», которое требует табуретка, по формуле4•h+12, если качество низкое, и 5•h+14, если качество среднее иливысокое, а также «стоимость», равная d•2, для низкого качест-ва, d•3, длясреднего качества, d•4, для высокого качества, где d — количество древесины, которое требует данный объект. Определить также метод «Информация», который возвращает строку, содержащую информацию обобъекте: Высоту, качество материала, количество древесины и стоимость.
Создать также класс наследник Стул с дополнительным свойством:высота спинки (hb, в см), и переопределить метод «количество древесины», по формуле d+2•hb+5, где d — количество древесины, которые требует табуретка с такими же параметра-ми (Метод «стоимость» непереопределять).
В главной программе (либо по нажатию на кнопку) создать экземплярыклассов Та-буретка и Стул, и напечатать информацию в таком виде:«табуретка» + информация о табуретке и «стул» + информация о стуле.
(Для реализации использовать классы и наследование.)
Ответ: Некропостеры. =)

Код Lisp
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
(defun positivep (x)
  (> x 0))
 
(deftype height ()
  `(and number (satisfies positivep)))
 
(defclass quality () ())
(defclass      low-quality (quality) ())
(defclass standard-quality (quality) ())
(defclass     high-quality (quality) ())
 
(defconstant      +low-quality+ (make-instance      'low-quality))
(defconstant +standard-quality+ (make-instance 'standard-quality))
(defconstant     +high-quality+ (make-instance     'high-quality))
 
(defclass tabouret ()
  ((h
    :initarg  :h
    :reader    height
    :initform (error "Высота обязательна - h")
    :type      height)
   (q
    :initarg  :q
    :reader    quality
    :initform +standard+
    :type      quality)))
 
(defclass chair (tabouret)
  ((hb
    :initarg  :hb
    :reader    back-height
    :initform (error "Высота спинки стула обязательна - hb")
    :type      height)))
 
(defgeneric amount-of-wood (x))
(defgeneric amount-of-wood-for-quality (x q))
 
(defmethod amount-of-wood ((x tabouret))
  (amount-of-wood-for-quality x (quality x)))
 
(defmethod amount-of-wood-for-quality ((x tabouret) (q low-quality))
  (+ (* 4 (height x)) 12))
 
(defmethod amount-of-wood-for-quality ((x tabouret) (q standard-quality))
  (+ (* 4 (height x)) 12))
 
(defmethod amount-of-wood-for-quality ((x tabouret) (q high-quality))
  (+ (* 5 (height x)) 12))
 
(defmethod amount-of-wood ((x chair))
  (+ (call-next-method)
     (* 2 (back-height x))
     5))
 
 
 
(defgeneric cost (x))
(defgeneric cost-for-quality (x q))
 
(defmethod cost ((x tabouret))
  (cost-for-quality x (quality x)))
 
(defmethod cost-for-quality ((x tabouret) (q low-quality))
  (* 2 (amount-of-wood x)))
 
(defmethod cost-for-quality ((x tabouret) (q standard-quality))
  (* 3 (amount-of-wood x)))
 
(defmethod cost-for-quality ((x tabouret) (q high-quality))
  (* 4 (amount-of-wood x)))
 
 
 
(defgeneric information (x))
(defgeneric information-title (x))
(defgeneric information-params (x))
 
(defmethod information ((x tabouret))
  (with-output-to-string (s)
    (format s "~&~a:~%" (information-title x))
    (loop :for (title . value) :in (information-params x)
          :do (format s "  ~20a: ~a~%" title value))))
 
(defmethod information-title ((x tabouret))
  "Табуретка")
 
(defmethod information-title ((x chair))
  "Стул")
 
(defmethod information-params ((x tabouret))
  `(("высота"           . ,(height x))
    ("качество"         . ,(information (quality x)))
    ("кол-во древесины" . ,(amount-of-wood x))
    ("стоимость"        . ,(cost x))))
 
(defmethod information-params ((x chair))
  (cons (cons "высота спинки" (back-height x))
        (call-next-method)))
 
(defmethod information ((x low-quality))
  "низкое")
 
(defmethod information ((x standard-quality))
  "среднее")
 
(defmethod information ((x high-quality))
  "высокое")
 
 
 
(defun main ()
  (dolist (q (list +low-quality+ +standard-quality+ +high-quality+))
    (dolist (x (list (make-instance 'tabouret :h 0.5 :q q)
                     (make-instance 'chair    :h 0.5 :q q :hb 0.6)))
      (princ (information x)))))
Код Lisp
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
> (main)
Табуретка:
  высота              : 0.5
  качество            : низкое
  кол-во древесины    : 14.0
  стоимость           : 28.0
Стул:
  высота спинки       : 0.6
  высота              : 0.5
  качество            : низкое
  кол-во древесины    : 20.2
  стоимость           : 40.4
Табуретка:
  высота              : 0.5
  качество            : среднее
  кол-во древесины    : 14.0
  стоимость           : 42.0
Стул:
  высота спинки       : 0.6
  высота              : 0.5
  качество            : среднее
  кол-во древесины    : 20.2
  стоимость           : 60.600003
Табуретка:
  высота              : 0.5
  качество            : высокое
  кол-во древесины    : 14.5
  стоимость           : 58.0
Стул:
  высота спинки       : 0.6
  высота              : 0.5
  качество            : высокое
  кол-во древесины    : 20.7
  стоимость           : 82.8
Вопрос: Если можно создать массив TButton, то как создать массив их событий?

Пишу программу в которой много однообразных Едитов и кнопок. Чтобы "облегчить сбе жизнь" создал MyEdit: array[1..64] of TEdit. Аналогично можно поступить и с кнопками: MyButton: array[1..64] of TButton. Теперь самое интересное: обработка событий кнопок везде одинаковая (допустим, при нажатии кнопки N необходимо записать в Едит N число 1). Как можно создать событие типа procedure TForm1.BitBtnNClick(Sender: TObject; N: integer);, чтобы можно было узнать какая кнопка была нажата и записать в соответвующий Едит?

Добавлено через 14 минут
Здесь, даже, можно поступить как-то проще:
Создать один обработчик для всех кнопок, например:
Код Delphi
1
2
3
procedure TForm1.Button1Click(Sender: TObject);
begin
......
Но как узнать, какая из 64 кнопок была нажата?
Ответ: Он хранит объект, для которого сработало событие, то есть,
Код Pascal
1
2
3
4
5
procedure TForm1.Button1Click(Sender: TObject);
var btn : TButton;
begin
  btn := Sender as TButton; // Вот она, кнопка, которую нажали, делай с ней что нужно
  // ...
Например, получай индекс нажатой кнопки и по нему выходи на Edit с тем же индексом:
Код Pascal
1
2
3
4
5
6
7
8
9
10
11
12
// uses StrUtils;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  btn : TButton;
  edit : TEdit;
begin
  btn := Sender as TButton;
  edit := FindComponent(Format('Edit%s', [TrimLeftSet(UpCase(btn.Name), ['A' .. 'Z'])])) as TEdit;
  // и пиши в edit что нужно...
  edit.Text:='hihi';
end;
Вопрос: Определить свойство типа double (только с методом get)

Свойство типа double ( только с методом get), в котором вычисляется средний возвраст работников кафедры.
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Lab_4_Paper
{
    class Employees : List<Chair>
    {
        private Person _data;
        private University _post;
        private int _age;
        private List<Chair> _chairData = new List<Chair>();
        
        public Employees(Person data, University post, int age)
        {
            _data = data;
            _post = post;
            _age = age;
        } 
 
        public Employees()
        {
            _data = new Person(" ", " ", new DateTime(1998, 08, 01));
            _post = University.Subdivisions;
            _age = 0;
        }
 
        public Person Data { get { return _data; } }
        public University Post { get { return _post; } }
        public int Age { get { return _age; } }
        public IReadOnlyList<Chair> ChairList { get { return _chairData.AsReadOnly(); } }
        public double AverageAge
        {
            get
            {
               
                return 0; // Вот тут!!!!
            }
 
        }
 
        public bool this[University rez_prov]
        {
            get
            {
                bool rez;
                if (rez_prov == _post) rez = true;
                else rez = false;
                return rez;
            }
        }
 
        public void AddChair(params Chair[] chair) 
        {
            _chairData.AddRange(chair);
        }
 
        public override string ToString() 
        {
            return string.Format("\nEmployee: {0}\nPost: {1}\nAge: {2}\nChair information: {3}", _data, _post, _age, _chairData);
        }
 
        virtual public string ToShortString()
        {
            return string.Format("\nEmployee: {0}\nPost: {1}\nAge: {2}\nAverage Age: {3}", _data, _post, _age, AverageAge);
        }
    }
}
Ответ:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Lab_4_Paper
{
    class Employees : List<Chair>
    {
        private static double SumAge=0;
        private static double quan = 0;
        private Person _data;
        private University _post;
        private int _age;
        private List<Chair> _chairData = new List<Chair>();
 
        public Employees(Person data, University post, int age)
        {
            _data = data;
            _post = post;
            _age = age;
            SumAge += age;
            quan++;
        }
 
        public Employees()
        {
            _data = new Person("Ilia", "Voloschuk", new DateTime(1998, 08, 01));
            _post = University.Subdivisions;
            _age = 0;
        }
 
        public Person Data { get { return _data; } }
        public University Post { get { return _post; } }
        public int Age { get { return _age; } }
        public IReadOnlyList<Chair> ChairList { get { return _chairData.AsReadOnly(); } }
        public double AverageAge
        {
            get
            {
                return SumAge/quan; // Вот тут!!!!
            }     
 
        }
 
        public bool this[University rez_prov]
        {
            get
            {
                bool rez;
                if (rez_prov == _post) rez = true;
                else rez = false;
                return rez;
            }
        }
 
        public void AddChair(params Chair[] chair)
        {
            _chairData.AddRange(chair);
        }
 
        public override string ToString()
        {
            return string.Format("\nEmployee: {0}\nPost: {1}\nAge: {2}\nChair information: {3}", _data, _post, _age, _chairData);
        }
 
        virtual public string ToShortString()
        {
            return string.Format("\nEmployee: {0}\nPost: {1}\nAge: {2}\nAverage Age: {3}", _data, _post, _age, AverageAge);
        }
    }
}