Обнаруживать и обрабатывать только уникальные изображения - PullRequest
0 голосов
/ 17 марта 2019

У меня проблема в том, что у меня есть изображение, которое появляется на двух страницах в одной книге.

Я хочу, чтобы моя программа реагировала (запускала побочный эффект) только при обнаружении новых изображений и игнорировала дубликаты. Как только это произошло, я хочу сбросить ее, чтобы процесс повторялся.

namespace testpad
{
    class Interaction: Scene
    {
        public override string Name => "Interaction";

        public static RectMap imageone = new RectMap()
        {
            X = 239,
            Y = 199,
            Width = 125,
            Height = 18
        };
        public static RectMap imagetwo = new RectMap()
        {
            X = 217,
            Y = 317,
            Width = 428,
            Height = 12

        public override bool Match(ScriptBase script)
        {
            return script.Match(imageone, 90),
                      || script.Match(imagetwo, 90);

        }
        public override void OnMatched(ScriptBase script)
        {
            if (script.Match(imageone, 90))
            {
                script.PressKey() { A = true });
                Thread.Sleep(100);
            }
            else if (script.Match(imagetwo, 90))
            {
                script.Press() { B = true });
                Thread.Sleep(1000);
            }
    }

}

1 Ответ

0 голосов
/ 21 марта 2019

Если вы ожидаете коллекцию объектов и хотите выполнять действия в зависимости от частоты их появления, лучшим решением будет Dictionary<[Key],int>, где Key - это идентификатор (в вашем случае String с именемизображения), а значение представляет частоту вашего ключа. Когда вы сталкиваетесь с объектом (в вашем случае давайте назовем его image) с заданным значением Key, вы увеличиваете значение, хранящееся в этом ключе. После этого вы можете принимать решенияна основе полученных частот.

Однако в вашем случае вам просто нужно реагировать только once, когда вы впервые столкнетесь с новым изображением, поэтому HashSet<String> будет вашей лучшей ставкой.

Так ваш код будет выглядеть так:

public void Iterate(IEnumerable<(string,object)>images)
{
     HashSet<string>set=new HashSet<string>();
     foreach(var item in images)
     {
         if(!set.TryGetValue(item.item1,out object obj))
         {
             set.Add(item.item1);
             //React(item.item2) ---do something the first time you encounter the image 
         }
     }

}
...