Страницы

Поиск по вопросам

пятница, 21 февраля 2020 г.

Как создать общий List<> для всех форм?(WinForms, C#)

#c_sharp #winforms #list


У меня есть две формы, одна добавляет в лист данные, вторая считывает, как можно
это реализовать?
    


Ответы

Ответ 1



как-то так static class InnerData { static public List AllData = new List(); } добавление InnerData.AllData.Add(data); чтение foreach(Data data in InnerData.AllData) { //something }

Ответ 2



Насколько я понимаю, Вам нужно создать некий объект, функцией которого будет хранить данные, которыми могут пользоваться другие объекты Вашего приложения. Следовательно Вам нужен объект, экземпляр которого будет единым для всего приложения, и будет создан единожды. А если ожидается работа из нескольких потоков с полями, свойствами и методами этого класса, то этот класс должен ещё и обеспечивать потокобезопасность. Для решения этой задачи отлично подходит такой паттерн, как Singleton (Одиночка). using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; namespace ConsoleApplication { public class MyDataClass { public String MyProperty { get; set; } } public sealed class ConcurrentDataSingleton { /// /// Объект для обеспечения потокобезопасного доступа к полям одиночки /// private readonly static object _lockObject = new object(); /// /// Коллекция данных /// private List _data; /// /// Статическое поле, хранящее ссылку на объект одиночки в управляемой куче /// private static ConcurrentDataSingleton instance; /// /// Метод получения ссылки на объект-одиночку /// /// public static ConcurrentDataSingleton GetInstance() { if (instance == null) instance = new ConcurrentDataSingleton(); return instance; } /// /// Закрытый конструктор, инициализирующий поля класса /// private ConcurrentDataSingleton() { this._data = new List(); } /// /// Метод добавления объекта в коллекцию (потокобезопасно) /// /// Объект данных public void AddData(MyDataClass data) { lock (_lockObject) { this._data.Add(data); } } /// /// Метод получения данных (потокобезопасно) /// /// Условие, по которому следует выбирать объекты из коллекции /// public List GetData(Expression> predicate) { lock (_lockObject) { return this._data.AsQueryable().Where(predicate).ToList(); } } } class Program { public static void Main() { //получаем ссылку на хранилище данных ConcurrentDataSingleton dataStore = ConcurrentDataSingleton.GetInstance(); //Добавление данных dataStore.AddData(new MyDataClass() { MyProperty = "value" }); //Получение данных List dataThatINeed = dataStore.GetData(mdc => mdc.MyProperty == "value"); } } }

Комментариев нет:

Отправить комментарий