_Q12_ Ответов: 3

Алгоритм очистки для очистки текста


В конце концов я закончу этот код. Но я хочу проверить, как вы это сделаете?
На данный момент я застрял, и мне нужно освежиться. Пауза.
Проблема формулируется примерно так:
У меня есть много изображений, которые содержат-pre и -fullview в конце своих имен.
Некоторые из них представляют собой один и тот же образ, некоторые отличаются...это полный бардак.
В -предварительные изображения при низких rezolution, но -fullview Макс rezolution.
Моя программа должна сортировать-pre from-ful (я сделал это уже с 2 списками).
затем сотрите-pre, если изображение имеет одно и то же имя для-pre и-full.
Имейте в виду, что есть также уникальные изображения, которые имеют предварительно, но не полные. Кроме того, только-полные изображения, которые не имеют-pre, чтобы быть очищенными.
Как бы вы справились с этим?.. галька ?
Спасибо.

Ахам...я посмотрел через окно. стек элемент, но... я никогда серьезно не работал с ним, поэтому мне трудно реализовать его в данный момент. Я упоминаю об этом, потому что, возможно, именно этого мне не хватает, чтобы сделать свою жизнь легче. Ты мне скажи.

Что я уже пробовал:

List<string> ImagesName = new List<string>();
ImagesName.AddRange(new string[] { "a.jpg", "a1-pre.jpg", "a1-fullview.jpg", "a2-pre.png", "a2-pre.png", "a3-fullview.jpg", "a3-fullview.jpg", "a4-fullview.jpg" });


//pre, fullview image duplicate cleaning
List<string> Duplicates = new List<string>();
string pre = "-pre.", ful = "-fullview."; bool isX = true;
string link = "", LinkWithNoPre = "", dupelink = "";
List<string> linkWithPre = new List<string>();
List<string> linkWithFul = new List<string>();
for (int i = 0; i < ImagesName.Count; i++)
{
    if (ImagesName[i].Contains(pre)) linkWithPre.Add(ImagesName[i]);
}
for (int i = 0; i < ImagesName.Count; i++)
{
    if (ImagesName[i].Contains(ful)) linkWithFul.Add(ImagesName[i]);
}

for (int k = 0; k < ImagesName.Count; k++)
{
    link = ImagesName[k];
    if (link.Contains(pre))
    {
        //clears the "-pre.jpg" from name
        int hu = link.IndexOf(pre);
        LinkWithNoPre = link.Remove(hu, link.Length - hu);


        for (int i = 0; i < linkWithPre.Count; i++)
        {
            link = linkWithPre[i];
            if (link.Contains(LinkWithNoPre))
            {

            }
        }
    }
}

3 Ответов

Рейтинг:
2

Richard MacCutchan

Так что вам нужно удалить pre файлы fullview версии.
Начните с перечисления всех fullview имена. Для каждого имени посмотрите, есть ли pre версия, и если да, то удалите ее. Или я что-то упускаю?


_Q12_

Мне нравится твое решение . Я думал немного сложнее.
Итак, для каждой полной версии, если она уже существует, удалите ее. Очень милый.
---
А если 2 одинаковых в группе из 3 файлов (1 пре и 2 одинаковых полных) ?
Я предполагаю 2 одинаковых списка, чтобы сравнить первый со вторым, и сделать 3d-список с результатами. О боже.

Richard MacCutchan

Вы не можете иметь два файла с одинаковыми именами в одной папке.

_Q12_

хех, это правда. :)

Рейтинг:
2

phil.o

Вы можете создать словарь, принимающий строку в качестве ключа (имя файла без суффикса-pre или-ful), связанного с кортежем логических значений, указывающих, существует ли имя файла с суффиксами-pre,- ful или обоими.
Затем вы можете перебирать словарь и действовать соответственно.

var dic = new Dictionary<string, Tuple<bool, bool>>;
// Here you populate the dictionary with file informations
foreach (string name in dic.Keys) {
  var entry = dic[name];
  if (entry.Item1 && !entry.Item2) {
    // Here the case where the file only exists with the -pre suffix
  }
  else if (!entry.Item1 && entry.Item2) {
    // Here the case where the file only exists with the -ful suffix
  }
  else if (entry.Item1 && entry.Item2) {
    // Here the case where both suffixes are present
  }


_Q12_

мне тоже нравится ваш ответ, но он немного продвинут для меня, так как я никогда не работал со словарями. Интересно ваше решение! Я попробую это сделать.

phil.o

Добро пожаловать. Словари довольно полезны, и не так уж трудно научиться ими пользоваться.

Рейтинг:
2

MadMyche

Я действительно думаю, что ключом к этому было бы перечисление фактических файлов через System.IO

1. используйте базовое имя файла (a, a1, a2)
2. Проверьте и посмотрите, существуют ли они, то же самое с -пред и -фул варианты
3. сравните базовые, предварительные и полные варианты, чтобы увидеть, являются ли они одним и тем же файлом.
4. если они соответствуют вашим правилам, удалите то, что не нужно.

Теперь есть несколько способов сравнить их:
1. Использование system.io чтобы получить основные свойства, такие как размер файла.
2. Откройте файлы в streamreader и проверьте MD5 содержимого
3. Откройте файл И...
3а. Использовать системы.чертеж и GDI, чтобы проверить размеры
-ИЛИ-
3б. Использовать свойства EXIF, чтобы проверить размеры


_Q12_

Хорошая идея тоже ! Хороший подход.
Дело в том...я избегаю упоминать об этом в самом начале, но на самом деле я получаю эти изображения как ссылки. В конце концов, они будут загружены и физически будут находиться на моем жестком диске. Но ваше решение может быть хорошо применено на практике, после того как я их всех опущу. Да, это очень приятно, особенно проверять размеры в GDI и системе.IO (который я могу сделать); другие варианты, которые я должен научиться делать (поток MD5 и Exif).
Очень мило.

MadMyche

Да, ссылки бросают в него ключ; все это потребовало бы, чтобы они были локальными. Если только в списке нет дополнительной информации, такой как размер файла и т. д.
Для MD5 есть хороший пример в https://stackoverflow.com/questions/10520048/calculate-md5-checksum-for-a-file