using System;
using System.Collections;
using System.Linq;
using System.Text;

namespace IControls_FireManager
{
    // ArrayList 는 여기에서 공용으로 처리할 수 있도록 한다

    /// 2012. 5.25 최종 판단
    /// 해쉬테이블과 리스트를 혼용하기로 함
    ///
    /// HashTable 의 경우 
    /// 1. 키가 존재하므로 자료 중복 체크 가능하다. 
    /// 2. 삭제가 쉽다. (데이타 타입에 상관없이 삭제가능하다)
    /// 3. 해쉬테이블안에 해쉬테이블이 있을 경우 접근이 힘들다 (데이타베이스의 쿼리만큼의 작업이 소요된다)
    /// 4. 기존프로젝트와의 함수 및 변수 재사용성이 떨어진다
    /// 5. 키값을 기준으로 하기 때문에 데이타베이스와 호환성은 우수하다.
    ///  
    /// 리스트 의경우
    /// 1. 중복 체크는 불가능하다 (리스트에 클래스 단위로 저장하는 경우)
    /// 2. 삭제가 쉽지않다 (단일 자료형태가 들어가는 경우는 쉽지만 클래스 형태로 들어가는 리스트의 아이템을 추출하는것도 어렵고 리스트 검색도중 리스트가 삭제될수는 없다)
    /// 3. 리스트안에 리스트가 있을 경우 접근이 쉽다 (단 키값으로 접근하지 못하기 때문에 부하가 걸릴 수가 있다)
    /// (키를 이용해서 찾지 않아도 되므로 접근성은 유연하다 (ACU 클래스안의 DOOR 클래스가 존재하는 경우 사용여부를 판단하기가 쉽다)
    /// 4. 재사용 가능하다.
    ///  
    /// 
    /// 제일 좋은 방법은 공용 함수 파라미터에 클래스 타입 자체를 전달해서 받은 함수쪽에서 리플렉션과 어트리뷰트를 사용하는것인데 
    /// MSDN 예제에서도 결국은 클래스 타입 이름은 알수 있어도 그 자체를 Runtime 상에서 메모리에 할당하는 것은 불가능하다.  
    /// (제일 큰 문제가 바로 HashTable 의 경우 의 3번 문제이다. 접근성이 해결되지 않는 것이 너무나 큰 문제이므로 해쉬테이블을 사용이 힘듬
    /// 
    /// 
    /// 결국 다음과 같이 사용한다
    /// 1. 기본적인 자료는 해쉬테이블에 저장한다 
    /// 2. 해쉬테이블의 키값은 따로 리스트로 관리한다
    /// 3. 키값으로 다이렉트로 접근할 수 있도록 구현하며 예제는 아래와 같다 
    /// 4. 해쉬테이블을 관리하는 키리스트는 항상 싱크가 맞도록 한다. (추가 : 해쉬테이블 추가 -> 키리스트에 추가, 삭제 : 해쉬테이블 제거 -> 키리스트 삭제
    ///
    /// 결론, 기존의 함수 사용법에 크게 벗어나지도 않으며 해쉬 테이블의 장점도 살릴수 있으며 속도도 빠르다. 특히 데이타베이스와 호환성은 충분히 살릴수 있다.


    // 예시. ACU 해쉬테이블에서 DOOR 포트 사용여부를 조회하는 기능
    //
    // int a=0;// 원하는 값을 찾으면 카운트 증가
    // ACU 키리스트만큼 돌린다    
    //foreach (string ACU_KEY in _Data.List_ACU_KEY)
    //{
    //    // 키에 있는 값을 토대로 접근한다
    //    if(((_DEVICE_ACU)_Data.Hash_ACU[ACU_KEY]).ACU_LAN_IP =="61.33.215.151")
    //    {
    //        // 찾았던 ACU 해쉬테이블의 Door 키리스트만큼 돌린다
    //        foreach (string DR_KEY in ((_DEVICE_ACU)_Data.Hash_ACU[ACU_KEY]).List_DR_KEY)
    //        {
    //            if (((_DEVICE_DOOR)((_DEVICE_ACU)_Data.Hash_ACU[ACU_KEY]).Hash_DR[DR_KEY]).PORT_ENABLE == true)
    //                // 원하는 값을 찾았다
    //                a++;
    //        }
    //    }
    //}
    //int b = a;
    

    public static class _LIst
    {
        

        // 데이타 삭제 
        // 이 공용 함수는 리스트에 string 자료형만 존재하는 리스트만 적용이 가능하다   
        // 여러개의 삭제를 한번에 처리할 수 있다.
        public static void Del_ByKeyList(ArrayList Original_KeyList, ArrayList Remove_KeyList, string Targetkey)
        {
            foreach (string key in Remove_KeyList)
            {
                if(key==Targetkey)
                    Original_KeyList.Remove(key);                    
            }
        }

        public static void Del_ByKeyList(ArrayList Original_KeyList, ArrayList Remove_KeyList)
        {
            foreach (string key in Remove_KeyList)
            {
                Original_KeyList.Remove(key);
            }
        }

    }
}