У меня есть две формы, одна добавляет в лист данные, вторая считывает, как можно это реализовать?
как-то так
static class InnerData
{
static public List<Data> AllData = new List<Data>();
}
добавление
InnerData.AllData.Add(data);
чтение
foreach(Data data in InnerData.AllData)
{
//something
}
Насколько я понимаю, Вам нужно создать некий объект, функцией которого будет хранить данные, которыми могут пользоваться другие объекты Вашего приложения. Следовательно Вам нужен объект, экземпляр которого будет единым для всего приложения, и будет создан единожды. А если ожидается работа из нескольких потоков с полями, свойствами и методами этого класса, то этот класс должен ещё и обеспечивать потокобезопасность. Для решения этой задачи отлично подходит такой паттерн, как 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");
}
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Вот такой код выполняется в отдельном классе(не статический, но экземпляр один) в таске: