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

208
14 апреля 2017, 19:30

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

Answer 1

как-то так

static class InnerData
{
  static public List<Data> AllData = new List<Data>();
}

добавление

InnerData.AllData.Add(data);

чтение

foreach(Data data in InnerData.AllData)
{
  //something
}
Answer 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
    {
        /// <summary>
        /// Объект для обеспечения потокобезопасного доступа к полям одиночки
        /// </summary>
        private readonly static object _lockObject = new object();
        /// <summary>
        /// Коллекция данных
        /// </summary>
        private List<MyDataClass> _data;
        /// <summary>
        /// Статическое поле, хранящее ссылку на объект одиночки в управляемой куче
        /// </summary>
        private static ConcurrentDataSingleton instance;
        /// <summary>
        /// Метод получения ссылки на объект-одиночку
        /// </summary>
        /// <returns></returns>
        public static ConcurrentDataSingleton GetInstance()
        {
            if (instance == null)
                instance = new ConcurrentDataSingleton();
            return instance;
        }
        /// <summary>
        /// Закрытый конструктор, инициализирующий поля класса
        /// </summary>
        private ConcurrentDataSingleton()
        {
            this._data = new List<MyDataClass>();
        }
        /// <summary>
        /// Метод добавления объекта в коллекцию (потокобезопасно)
        /// </summary>
        /// <param name="data">Объект данных</param>
        public void AddData(MyDataClass data)
        {
            lock (_lockObject)
            {
                this._data.Add(data);
            }
        }
        /// <summary>
        /// Метод получения данных (потокобезопасно)
        /// </summary>
        /// <param name="predicate">Условие, по которому следует выбирать объекты из коллекции</param>
        /// <returns></returns>
        public List<MyDataClass> GetData(Expression<Func<MyDataClass, Boolean>> 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<MyDataClass> dataThatINeed = dataStore.GetData(mdc => mdc.MyProperty == "value");
        }
    }
}
READ ALSO
ASP.NET WebForms выбор шаблона столбца GridView

ASP.NET WebForms выбор шаблона столбца GridView

Есть GridViewВ нем есть TemplateField

216
Боковые меню в приложениях WPF

Боковые меню в приложениях WPF

Какие способы сделать такое боковое меню в WPF?

389
c sharp не запускается событие WebClient.DownloadProgressChanged

c sharp не запускается событие WebClient.DownloadProgressChanged

Вот такой код выполняется в отдельном классе(не статический, но экземпляр один) в таске:

172
Json сериализация списка

Json сериализация списка

Создал класс однонаправленного связного списка

169