Приветствую. Есть проблема. Мне нужно получить список файлов с сортировкой по дате изменения, кубик получает список с сортировкой по имени. Как сделать, хелп.
List<string> files = Directory.GetFiles(project.Directory).ToList();
List<string> times = new List<string>();
List<string> times2 = new List<string>();
List<string> dates = new List<string>();
List<string> cor = new List<string>();
List<string> sort = new List<string>();
List<string> resultat = new List<string>();
var table = project.Tables["Таблица 1"];
table.Clear();
for(int i = 0; i<files.Count; i++) {
times.Add(File.GetLastWriteTime(files[i]).ToString()); //время в отдельном файле
table.AddRow(files[i]+";"+File.GetLastWriteTime(files[i]).ToString());
}
//Теперь нужно обработать и отрезать
//1 переводим дату в корректный формат
for(int i = 0 ; i < times.Count; i++) {
string curable = times[i];
var cured = curable.Split(new [] {" "},StringSplitOptions.None).ToList();
times2.Add(cured[0].ToString());
dates.Add(cured[1].ToString());
}
// соединяем дату в корректный формат
for(int i = 0 ; i < times2.Count ; i++) {
var correct = times2[0].Split(new [] {"."},StringSplitOptions.None).ToList();
string result = correct[2]+"."+correct[1]+"."+correct[0];
cor.Add(result);
}
// теперь добавляем время к корректной дате Формируем список для сортировки
for(int i = 0 ; i < cor.Count ; i++) {
sort.Add(cor[i]+" "+dates[i]);
}
//Сортируем список Sort через Sort
sort.Sort();
times2.Clear(); //Очищаем старые данные
dates.Clear(); //Оставляем место для новых
cor.Clear();
//Теперь нужно вернуть значения обратно. применяем ранее известные функции сплитов и возвращаемся к исходному значению.
for(int i = 0 ; i < sort.Count; i++) {
string sorted = sort[i];
var letsback = sorted.Split(new [] {" "},StringSplitOptions.None).ToList();
times2.Add(letsback[0].ToString());
dates.Add(letsback[1].ToString());
}
//Абсолютно такой же цикл, переворачивающий дату задом наперёд
for(int i = 0 ; i < times2.Count ; i++) {
var correct = times2[0].Split(new [] {"."},StringSplitOptions.None).ToList();
string result = correct[2]+"."+correct[1]+"."+correct[0];
cor.Add(result);
}
//Снова соединяем значения
for(int i = 0 ; i < cor.Count ; i++) {
sort.Add(cor[i]+" "+dates[i]);
}
// а теперь ищем по отсортированным значениям - совпадения из times - исходного файла
/*for(int i = 0 ; i < sort.Count ; i++) {
for(int j=0; j < cor.Count ; j++) {
}
}*/
for(int i = 0; i < times.Count ; i++) {
for(int j = 0 ; j <sort.Count ; j++) {
if(sort[i].Contains(times[j]))
resultat.Add(table.GetCell(0,j));
}
}
покопай в сторону linq. Там всё одной строкой делаетсяОчень большой и страшный код. Я напутал в индексах с последнем цикле, ошибку не понял, но до него все работает. Вернусь немного позже.C#:List<string> files = Directory.GetFiles(project.Directory).ToList(); List<string> times = new List<string>(); List<string> times2 = new List<string>(); List<string> dates = new List<string>(); List<string> cor = new List<string>(); List<string> sort = new List<string>(); List<string> resultat = new List<string>(); var table = project.Tables["Таблица 1"]; table.Clear(); for(int i = 0; i<files.Count; i++) { times.Add(File.GetLastWriteTime(files[i]).ToString()); //время в отдельном файле table.AddRow(files[i]+";"+File.GetLastWriteTime(files[i]).ToString()); } //Теперь нужно обработать и отрезать //1 переводим дату в корректный формат for(int i = 0 ; i < times.Count; i++) { string curable = times[i]; var cured = curable.Split(new [] {" "},StringSplitOptions.None).ToList(); times2.Add(cured[0].ToString()); dates.Add(cured[1].ToString()); } // соединяем дату в корректный формат for(int i = 0 ; i < times2.Count ; i++) { var correct = times2[0].Split(new [] {"."},StringSplitOptions.None).ToList(); string result = correct[2]+"."+correct[1]+"."+correct[0]; cor.Add(result); } // теперь добавляем время к корректной дате Формируем список для сортировки for(int i = 0 ; i < cor.Count ; i++) { sort.Add(cor[i]+" "+dates[i]); } //Сортируем список Sort через Sort sort.Sort(); times2.Clear(); //Очищаем старые данные dates.Clear(); //Оставляем место для новых cor.Clear(); //Теперь нужно вернуть значения обратно. применяем ранее известные функции сплитов и возвращаемся к исходному значению. for(int i = 0 ; i < sort.Count; i++) { string sorted = sort[i]; var letsback = sorted.Split(new [] {" "},StringSplitOptions.None).ToList(); times2.Add(letsback[0].ToString()); dates.Add(letsback[1].ToString()); } //Абсолютно такой же цикл, переворачивающий дату задом наперёд for(int i = 0 ; i < times2.Count ; i++) { var correct = times2[0].Split(new [] {"."},StringSplitOptions.None).ToList(); string result = correct[2]+"."+correct[1]+"."+correct[0]; cor.Add(result); } //Снова соединяем значения for(int i = 0 ; i < cor.Count ; i++) { sort.Add(cor[i]+" "+dates[i]); } // а теперь ищем по отсортированным значениям - совпадения из times - исходного файла /*for(int i = 0 ; i < sort.Count ; i++) { for(int j=0; j < cor.Count ; j++) { } }*/ for(int i = 0; i < times.Count ; i++) { for(int j = 0 ; j <sort.Count ; j++) { if(sort[i].Contains(times[j])) resultat.Add(table.GetCell(0,j)); } }
Ага. Спасибо)покопай в сторону linq. Там всё одной строкой делается
Вот ещё решение. Уже работает до конца. В проекте нужны только "Список 1" и "Таблица 1".Приветствую. Есть проблема. Мне нужно получить список файлов с сортировкой по дате изменения, кубик получает список с сортировкой по имени. Как сделать, хелп.
List<string> files = Directory.GetFiles(project.Directory).ToList();
var table = project.Tables["Таблица 1"];
table.Clear();
project.Lists["Список 1"].Clear();
foreach(string item in files)
table.AddRow(item+";"+File.GetLastWriteTime(item).ToString());
List<string> times = table.GetColumn(1).ToList();
List<string> cortimes = new List<string>();
List<string> end = new List<string>();
List<string> final = new List<string>();
foreach(string time in times) {
var result = time.Split(new [] {" "},StringSplitOptions.None).First().ToString();
var date = time.Split(new [] {" "},StringSplitOptions.None).Last().ToString();
var res2 = result.Split(new [] {"."},StringSplitOptions.None).ToList();
res2.Reverse();
cortimes.Add(String.Join(".",res2)+" "+date);
}
cortimes.Sort(); //сортировали
foreach(string sorted in cortimes) {
var corres = sorted.Split(new [] {" "},StringSplitOptions.None).First().ToString();
var cordate = sorted.Split(new [] {" "},StringSplitOptions.None).Last().ToString();
var cor2 = corres.Split(new [] {"."},StringSplitOptions.None).ToList();
cor2.Reverse();
end.Add(String.Join(".",cor2)+" "+cordate);
}
for(int i=0;i<end.Count; i++) {
for(int j=0;j<table.RowCount;j++) {
if(end[i]==table.GetCell(1,j)) final.Add(table.GetCell(0,j));
}
}
project.Lists["Список 1"].AddRange(final);
Так получше будет? ))покопай в сторону linq. Там всё одной строкой делается
говорю же, 1 строка)Вот ещё решение. Уже работает до конца. В проекте нужны только "Список 1" и "Таблица 1".
C#:List<string> files = Directory.GetFiles(project.Directory).ToList(); var table = project.Tables["Таблица 1"]; table.Clear(); project.Lists["Список 1"].Clear(); foreach(string item in files) table.AddRow(item+";"+File.GetLastWriteTime(item).ToString()); List<string> times = table.GetColumn(1).ToList(); List<string> cortimes = new List<string>(); List<string> end = new List<string>(); List<string> final = new List<string>(); foreach(string time in times) { var result = time.Split(new [] {" "},StringSplitOptions.None).First().ToString(); var date = time.Split(new [] {" "},StringSplitOptions.None).Last().ToString(); var res2 = result.Split(new [] {"."},StringSplitOptions.None).ToList(); res2.Reverse(); cortimes.Add(String.Join(".",res2)+" "+date); } cortimes.Sort(); //сортировали foreach(string sorted in cortimes) { var corres = sorted.Split(new [] {" "},StringSplitOptions.None).First().ToString(); var cordate = sorted.Split(new [] {" "},StringSplitOptions.None).Last().ToString(); var cor2 = corres.Split(new [] {"."},StringSplitOptions.None).ToList(); cor2.Reverse(); end.Add(String.Join(".",cor2)+" "+cordate); } for(int i=0;i<end.Count; i++) { for(int j=0;j<table.RowCount;j++) { if(end[i]==table.GetCell(1,j)) final.Add(table.GetCell(0,j)); } } project.Lists["Список 1"].AddRange(final);
Так получше будет? ))
Ужасы какие))) Копаю дальше)говорю же, 1 строка)
Пожалуйста...Приветствую. Есть проблема. Мне нужно получить список файлов с сортировкой по дате изменения, кубик получает список с сортировкой по имени. Как сделать, хелп.
Пожалуйста...
List<string> files = Directory.GetFiles(project.Directory).OrderBy(f => File.GetLastWriteTime(f)).ToList();
Можете полный текст кубика написать?C#:List<string> files = Directory.GetFiles(project.Directory).OrderBy(f => File.GetLastWriteTime(f)).ToList();
Что именно необходимо реализовать?Можете полный текст кубика написать?
Окончательная цель загрузить профиль с самой ранней датой сохранения. Поэтому получение списка файла отсуртированного по дате сохранения очень интересная возможность. Это многим пригодится для выбора очередного(самого старого) профиля для обработки. Или самого нового, например загрузить только что обработанный профиль другим шаблоном.Что именно необходимо реализовать?
List<string> files - это объект списка.Поэтому получение списка файла отсуртированного по дате сохранения очень интересная возможность.
project.Variables["var"].Value = files[0]; // Первый элемент списка
project.Variables["var"].Value = files.Last(); // Последний элемент списка
// Если необходимо работать с обычным списком из ZP. То сначала объявите его в кубике и в конце добавьте в него массив из временного списка files.
IZennoList lst = project.Lists["lst"]; // Объявление списка
lst.AddRange(files);
IZennoList lst = project.Lists["lst"];
List<string> files = Directory.GetFiles(@"C:\Users\User\Downloads").OrderBy(f => File.GetLastWriteTime(f)).ToList();
lst.AddRange(files);
project.Variables["var"].Value = lst.Last();
Спасибо большое!!!List<string> files - это объект списка.
Поэтому взаимодействуйте с ним:
Полный кодC#:project.Variables["var"].Value = files[0]; // Первый элемент списка project.Variables["var"].Value = files.Last(); // Последний элемент списка // Если необходимо работать с обычным списком из ZP. То сначала объявите его в кубике и в конце добавьте в него массив из временного списка files. IZennoList lst = project.Lists["lst"]; // Объявление списка lst.AddRange(files);
C#:IZennoList lst = project.Lists["lst"]; List<string> files = Directory.GetFiles(@"C:\Users\User\Downloads").OrderBy(f => File.GetLastWriteTime(f)).ToList(); lst.AddRange(files); project.Variables["var"].Value = lst.Last();