Рейтинг:
7
Maciej Los
Я бы предложил использовать Файл.Метод ReadAllLines (System.IO)[^] для чтения данных из текстового файла.
[РЕДАКТИРОВАТЬ]
Ваш класс нуждается в некоторых улучшениях:
Согласно нашей дискуссии, я внес некоторые изменения в класс:
public class Signal
{
private string sName = string.Empty;
private byte[] oData = new byte[]{};
public Signal(string _Name, string _data)
{
sName = _Name;
oData = _data.Select(x=>byte.Parse(x.ToString())).ToArray();
}
public string Name
{
get => sName;
set => sName = value;
}
public byte[] Data
{
get => oData;
set => oData = value;
}
public List<KeyValuePair<byte, int>> Map
{
get
{
List<KeyValuePair<byte, int>> map = new List<KeyValuePair<byte, int>>();
int i = 0;
int j = 0;
int l = oData.Length;
while(i<l)
{
int k = 0;
j = i;
while(oData[i]==oData[j])
{
k++;
j++;
if(j==l) break;
}
KeyValuePair<byte, int> kvp = new KeyValuePair<byte, int>(oData[i], k);
map.Add(kvp);
i = j-1;
i++;
}
return map;
}
}
public override string ToString()
{
return string.Format("{0}\n{1}\n", sName, string.Join("", oData));
}
}
Использование:
void Main()
{
string[] lines = File.ReadAllLines("FullFileName.txt");
//get names
var names = lines
.Where(x=>x.Trim().StartsWith("S"))
.ToList();
//get data
var datas = lines
.Where(x=>!x.Trim().StartsWith("S") && x.Trim()!=string.Empty)
.ToList();
//create list of Singal class
List<Signal> signals = names.Zip(datas,
(n, d)=> new Signal(n, d))
.ToList();
foreach(Signal s in signals)
{
Console.WriteLine("{0} '{1}'=>[{2}]", s.Name, string.Join("", s.Data), string.Join("|", s.Map.Select(x=>x.Key + ":" + x.Value)));
}
}
Пример вывода:
Signal 1 '00000000111101010'=>[0:8|1:4|0:1|1:1|0:1|1:1|0:1]
Signal 2 '1010'=>[1:1|0:1|1:1|0:1]
Signal 3 '0111100001110'=>[0:1|1:4|0:4|1:3|0:1]
Удачи вам!
hamid18
Большое спасибо Мацей.
Maciej Los
Всегда пожалуйста.
hamid18
Данные повторяют паттерн 0s и 1s. Я не хочу сохранять этот повторяющийся шаблон данных. Я хочу сделать карту, подобную той, о которой я упоминал ниже. Я знаю, что не могу использовать словарь здесь. Поскольку ключ должен быть уникальным в словаре. Я не знаю никакой другой структуры данных, которая делает отображение. Так, как я хочу сделать. Потому что в конце концов я получу исходные данные из этого сопоставления.
0 5
1 6
0 4
1 3
0 1
Maciej Los
Извините, но я вас не понимаю... Что вы имеете в виду под этим "Данные повторяют паттерн 0s и 1s."?
Значит ли это, что у вас есть только сигналы 0 и 1? Вы хотите сгруппировать данные по их названию и суммировать данные ulong?
[РЕДАКТИРОВАТЬ]
Если я вас хорошо понимаю, вам не нужно использовать объект словаря. Видеть:
var signals = names.Zip(datas,
(n, d)=> new Signal(n, d))
.GroupBy(x=>x.Name)
.Select(grp=> new Signal(grp.Key, (ulong)grp.Sum(y=>(decimal)y.Data)))
.ToList();
Попробуй!
hamid18
На самом деле свойство Data каждого экземпляра сигнала содержит такие значения, как 01000011111100000111000101. Здесь мы имеем повторение одних и тех же чисел. Мы хотим его уплотнить. как будто мы можем сделать карту, которая
0 1
1 1
0 4
1 6
0 5
это показывает, что если мы начнем с первой цифры, то получим один 0s. Тогда у нас есть один 1С. Тогда у нас есть четыре 0. Таким образом, мы можем сохранить всю последовательность чисел в типе данных int. И в конце концов мы можем получить исходные данные, используя ту же самую карту.
Maciej Los
Оооууу, у меня есть ты.
В этот момент Data
свойство хранит данные ulong. Вы хотите реализовать метод отображения 01000011111100000111000101
как массив о и 1?
hamid18
Я хочу сжатие без потерь. Потому что улонг занимает много памяти. И я хочу хранить в int, который будет занимать меньше памяти. Но в то же время я не хочу терять свои сигнальные данные. В конце концов, когда я хочу получить обратно исходные данные, я должен быть в состоянии вернуться.
Я не могу использовать GZipStream.
Maciej Los
Взгляните на обновленный ответ.
Maciej Los
Всегда пожалуйста ;)
hamid18
Привет,
Я хочу присвоить первое индексное значение массива байтов int. Ни я не получаю ни ошибки компиляции, ни ошибки времени выполнения. Но я не получаю требуемого результата. Я поискал в интернете и узнал, что если у нас есть 4 индекса, то мы можем преобразовать их в int. Но мне нужен только 1-й индекс для работы.
Maciej Los
int FirstByteOfFirstSignal = signals[0].Data[0];<pre>