Enum을 쓰면서 Enum안에 있는 값들을 쭉 돌면서 확인하고 싶을때가 있었는데.... 그 방법을 찾지 못했었는데요... (멍청하게도..)
Enum.GetValues(EnumType)  << 요론넘이 있었군요.. 

State라는 이름의 Enum이 있을때
Enum.GetValues(Typeof(State)) 이렇게 하면 Array로 안에 애들이 나오는군요..
 
by 피요히코~ 2011. 8. 16. 11:34
이거 때문에 꽤나 골치 아팠었는데
해결방법이 있었네여....

Productivity Power Tools

이 애드온을 설치하면 되는거네요..(아직 해보진 않았지만..)

도구-확정관리자 에서 검색해서 설치하면 되네요..
후훗

출처 : 맨날맑음님 블로그
by 피요히코~ 2010. 12. 10. 17:14
어떤 형식을 List로 만들어서 관리할때 sort를 해야 할 경우도 생깁니다. (당연..;;;)

List의 Sort는 기본적으로 4개의 오버로드가 존재합니다.
1. List.Sort()
2. List.Sort(제네릭 Comparison)
3. List.Sort(제네릭 IComparer)
4. List.Sort(Int32, Int32, 제네릭 IComparer)

아무런 파라미터를 받지 않는 기본 Sort도 있고
특정 파라미터를 받는 Sort도 있는데
그 사용법을 간단히 정리해 보면

일단 리스트가 있어야 하니..
List myList = new List();
myList.Add("Daum");
myList.Add("Google");
myList.Add("Bing");
myList.Add("Naver");

이런 리스트가 있다고 할때
2번의 Sort를 쓰려면

public int compare(string x, string y)
{
return x.CompareTo(y);
}

요런 메서드를 하나 만들어서 (물론 구현내용은 자유롭겠져. 반환값만 -1,0,1 이면 뭐)

myList.Sort(compare);

이렇게 써주면 됩니다.

3번 Sort를 쓰려면
IComparer 을 구현한 클래스를 만들어야 합니다.

public class StringCompare : IComparer
{
public int Compare(string x, string y)
{
return x.CompareTo(y);
}
}

요런 클래스를 만든 후에

StringCompare sc = new StringCompare();
myList.Sort(sc);

요렇게 쓰면 되져. 
 4번 방법이야 sort할 index를 정해주는거니 별 차이 없구여

근데 sort를 무명메서드를 이용해서 코드를 만들수도 있습니다.
무명메서드는 delegate로 해도 되고 람다식을 써도 됩니다.

delegate를 쓰면
myList.Sort(delegate(string x, string y)
{
return x.CompareTo(y);
});

람다식을 쓰면
myList.Sort((string x, string y) => x.CompareTo(y));

이렇게 쓰면 됩니다.
취향따라 쓰면 되겠네요.

참고로 MSDN을 보면
Sort의 정렬방식에 대해 이렇게 써 있어요

 

이 메서드는 QuickSort 알고리즘을 사용하는 System.Array.Sort를 사용합니다. 이 구현에서는 불안정한 정렬을 수행합니다. 즉, 두 개의 같은 요소가 있을 경우 이들 요소의 순서가 유지되지 않을 수 있습니다. 이와 반대로 안정된 정렬은 동일한 요소의 순서를 그대로 유지합니다.

평균적으로 이 메서드는 O(n log n) 연산이며, 여기서 nCount입니다. 최악의 경우 이 메서드는 O(n ^ 2) 연산입니다.

by 피요히코~ 2010. 12. 10. 17:07


책이고 뭐고
이거보면서 링크 보면 끝날듯..

근데 인간적으로 MSDN에 써잇는건 말이 너무 이상해. ㅠㅠㅋ
by 피요히코~ 2010. 12. 9. 16:04
XML형식의 string을 XDocument.Parse(string) 해서 XDocument로 만든후에

그 XML에서 특정 element만 가져오고 싶으면
(from node in XDocument.Descendants("elementName") select node)

이렇게 하면 여러개의 XElement가 나올것이고

이걸 만약 List<XElement> 형식으로 바꾸고 싶으면
(from node in XDocument.Descendants("elementName") select node).ToList<XElement>();
하면 됩니다.

만약 이걸 특정 attribute를 가지고 Dictionary형태로 만들고 싶으면
Dictionary<string,string> 인데 attribute중 class가 key고 name이 value라면
(from node in XDocument.Descendants("elementName") select node).ToDictionary( t => t.Attribute("class").value, t => t.Attribute("name").value);


요로케..

음.. 이게 LINQ인가... ;;;


by 피요히코~ 2010. 12. 9. 09:47
비주얼 스튜디오 등에서 xaml파일을 볼때 보여지는 컨트롤은
그냥 보여지는게 아니라 Init 된 후 보여지는겁니다. (아마도? )
근데 만약 어떤 컨트롤이 초기화 될때
뭐 웹페이지의 어떤 스크립트를 호출한다든지 하는 코드가 있을때
그놈을 디자인모드에서 보면 에러가 나겠죠

그러면 Init할때
이놈이 디자인모드에서 보여지는지를 보고
아닐때만 적절한 초기화를 하면 됩니다.
그때 사용할 수 있는게

DesignerProperties.GetIsInDesignMode(DependencyObject element)

이놈입니다.
흐흐..
by 피요히코~ 2010. 12. 8. 15:06
실버라이트에서 datagrid를 사용할때
안에 기본 textbox나 textblock이 아니라 checkbox나 combobox등을 넣어서 사용해야 할 때도 있져.
근데 checkbox를 사용해서 checked이벤트를 이용해 뭔가 해야 할 때가 있습니다.

근데 이놈이
실제로 체크를 하지 않은넘들까지 지 혼자 체크가 되는 경우가 생깁니다.
(찾아보니 checkbox만의 문제는 아니라 datagrid의 스크롤과 관련된 문제로 보이네요)

위에 세놈을 체크하고 스크롤로 내려보면 아래에 엄한 애들까지 체크가 되어있고.
근데 이게 UI상에서는 체크가 되어 있지만 실제로 체크 이벤트를 타지는 않기 때문에
체크때 뭔가 작업을 해준게 있다면 거기엔 적용이 안됩니다. 허허...

해결방법은..
그냥 scrollviewer로 datagrid를 감싸주면 됩니다.-_-ㅋ
이게 정말 단순히 datagrid에서 스크롤이 일어날때 발생하는 문제인가 보네요

datagrid의 VerticalScrollBarVisibility를 hidden을 주고
감싸고 있는 scrollviewer에 VerticalScrollBarVisibility를 auto를 주고 테스트 해보니
잘 되네요..

실버라이트가 참.
이래저래 요상한 부분이 많네요. -_-
System.Data도 쓸수 있게 해줬으면. ㅠㅠ
by 피요히코~ 2010. 12. 1. 11:21

어느날 갑자기 집 컴터의 IE8에서 개발자도구를 키면 분명 이놈이 실행은 되는데 볼수는 없는
기이한 현상이 생겼습니다.
귀찮아서 걍 냅뒀는데..
이제 회사 컴터에서도 그래서
열심히 검색검색...
이거저거 다 검색해보고
영어로도 검색해 봐도 못찾다가..
엄하게. 찾게 됐네요..

처음 적용했더니
적용이 안되길래
IE 다 끄고 다시 했드니. 잘 되네요..

더 웃긴건..
뭐라고 검색해서 찾았는지 기억이 안남.. (5분도 안됐는데...)
열어본 페이지에서도 못찾겠음..(오늘 날짜로 들어간 페이지가 10개도 안되는데. 없음...;;;;)

출처를 남기려 했는데.... (ms쪽에 질문해서 답변 받은 페이지 같았는데.. ;;;;)
그래도 질답 페이지였으니.. ㅠㅠㅋ

암튼 그 문제의 원인은
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IEDevTools 에 있는 WindowsPos의 값이
너무 높게 설정되어 있어서 생긴 문제라고 하네요..

해결 방법은
아래 내용을 그냥 메모장에 넣고.
ie.reg 이름으로 저장한 후 실행하면 됩니다..

으으~~~

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IEDevTools]
"Disabled"=dword:00000000
"UseDevToolsDebugger"=dword:00000001
"Pinned"=dword:00000000
"Minimized"=dword:00000000
"MinimizedRestoreHeight"=dword:00000000
"MenuBar"=dword:00000001
"ActiveTab"=dword:00000000
"ActivePaneLeft"=dword:00000000
"WindowPos"=hex:0a,00,00,00,0a,00,00,00,00,04,00,00,00,03,00,00
"1"=hex:

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IEDevTools\Options]
"ValidateHtml"="http://go.microsoft.com/fwlink/?LinkID=129216&verbose=1&uri=%url%"
"ValidateCss"="http://go.microsoft.com/fwlink/?LinkId=129217&profile=css2&warning=2&uri=%url%"
"ValidateRss"="http://go.microsoft.com/fwlink/?LinkId=129220&url=%url%"
"ValidateLocalHtml"="http://go.microsoft.com/fwlink/?LinkId=129218"
"ValidateLocalCss"="http://go.microsoft.com/fwlink/?LinkId=129219"
"ValidateLinks"="http://go.microsoft.com/fwlink/?LinkId=129221&check=Check&hide_type=all&summary=on&uri=%url%"
"ValidateAcc508"="http://go.microsoft.com/fwlink/?LinkId=129222&rptmode=-1&url1=%url%"
"ValidateAccWCAG"="http://go.microsoft.com/fwlink/?LinkId=129223&rptmode=2&url1=%url%"
"ValidateHtmlDomain"="w3.org"
"ValidateCssDomain"="w3.org"
"ValidateRssDomain"="feedvalidator.org"
"ValidateLocalHtmlDomain"="w3.org"
"ValidateLocalCssDomain"="w3.org"
"ValidateLinksDomain"="w3.org"
"ValidateAcc508Domain"="contentquality.com"
"ValidateAccWCAGDomain"="contentquality.com"

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IEDevTools\Options\BkgColor]
"ClassIDBkgColor"="#FFCCCC"
"LinkPathBkgColor"="#FFCCCC"
"TabIndexBkgColor"="#FFCCCC"
"AccessibilityBkgColor"="#FFCCCC"
"ImgDimsBkgColor"="#FFCCCC"
"ImgSrcBkgColor"="#FFCCCC"
"ImgSizeBkgColor"="#FFCCCC"
"ImgAltTxtBkgColor"="#FFCCCC"

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IEDevTools\Options\DisableScript]

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IEDevTools\Options\Resize]

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IEDevTools\Options\Ruler]
"SnapToXY"=dword:00000001
"SnapToElements"=dword:00000000
"HideTicks"=dword:00000000
"HideEndPoints"=dword:00000000
"RulerCurrentColor"=dword:00000000
"RulerColor1"=dword:00ffffff
"RulerColor2"=dword:00000000
"RulerColor3"=dword:000000ff
"RulerColor4"=dword:0000ff00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IEDevTools\Options\ZoneOptions]

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\IEDevTools\ValidateConsent]


by 피요히코~ 2010. 10. 30. 00:39

요즘 delegate랑 thread를 열심히(?) 공부하고 있습니다..
나름 좀 이해가 된다고 생각은 되지만
언제 어떻게 적용하면 좋을지는 아직 잘 모르겠네요..;;;;

예제 코드는 이렇습니다.
일단 비동기로 호출할 Add 메서드가 있습니다.


public static int Add(int op1, int op2, out int result)
{
    Console.WriteLine("[Add] 시작...");
    Thread.Sleep(3000);
    Console.WriteLine("[Add] 끝...");
    return (result = op1 + op2);
}

중간 중간 화면에 하고 있는걸 보여주고
실제로 뭔가 하는거 처럼 보이도록 Thread.Sleep 을 해줍니다.


그리고 delegate도 하나 선언해 줍니다.

public delegate int AddDelegate(int op1, int op2, out int result);

이 delegate는 위에 있는 Add메서드와 signature가 같습니다.

그리고 다음과 같은 메인코드가 있습니다.

static void Main(string[] args)
{
    int result;

    AddDelegate add = new AddDelegate(Add);

    Console.WriteLine("[Main] 비동기로 Add메서드 Invoke");
    IAsyncResult iAR = add.BeginInvoke(6, 42, out result, null, null);  

    Console.WriteLine("[Main] 뭔가 하는거 처럼 보이도록...");

    for (int i = 0; i < 10; i++)
    {
        Thread.Sleep(200);
        Console.Write(".");
    }

    Console.WriteLine("\n[Main] Add메서드가 끝날때 까지 대기...");
    iAR.AsyncWaitHandle.WaitOne();
    Console.WriteLine("[Main] Add메서드 종료");

    add.EndInvoke(out result, iAR); 
    Console.WriteLine("[Main]  result 는 '{0}'", result);
    Console.ReadLine();
}




메인에서는 delegate에 메서드를 넣어서 만들어 주고
BeginInvoke해 줍니다.
(BeginInvoke의 네번째와 다섯번째 파라미터는 callBack과 위임 객체에 접근하기 위한 참고객체 입니다.)
그러면 Add메서드를 호출하는 작업스레드를 생성해 주고 IAsyncResult객체를 반환해 줍니다.
그 객체는 iAR에 들어가겠죠

중간에 들어있는 for문은 그냥 메인도 뭔가 하는거 처럼 보이게 하기위한 코드 입니다.

그리고 반환받은 IAsyncResult객체를 이용해서
스레드가 끝날 때 까지 대기 하도록 WaitOne을 호출 해 줍니다.

그 후에 EndInvoke를 이용해서 결과값을 반환 받습니다.
EndInvoke는 Add메서드와 동일한 반환값을 가지므로
result를 out으로 안해도 값을 받아올 수 있습니다.

간단해 보이는데
참 난감하네요. ;;

by 피요히코~ 2010. 10. 8. 16:44

데이터를 주고 받을때. 특히 네트워크 상에서는 XML을 많이 사용하죠..

받아온 XML을 입맛에 맛게 사용하기 위해서는
(입맛에 맛게라기 보단 먹을수 있게......쪽이 더 맞으려나..)

XML을 역직렬화 하는 과정이 필요합니다.

그럴때 XML을 클래스에 맵핑(? 이라고 해야 하나요? 다른말을 써야하나? ㅋ)하기 위해
클래스를

[XmlRoot(ElementName = "WVP")]
    public class MainTopicListModel
    {
        [XmlElement(ElementName = "TopicList")]
        public TopicListModel Topic { get; set; }

뭐 이런식으로 XmlAttribute 를 써서 클래스를 만드는데...
사실 헷깔리지 않게 잘만 만들면
간단하게 알아서 잘 역직렬화가 되는데

혹시라도

가끔..

이상하게 데이터가 잘 넘어오는데
이상하게
특정변수만 값이 계속 안넘어 온다면

Name을 잘 보는것도 괜찮습니다...

혹시나.. 뒤쪽에 공백이 없는지를 확인을... ㅠㅠ


뭐 이런실수. 아무도 안하겠지만
뒤쪽에 공백 하나 때문에
계속 값이 한개만 안넘어와서

혼자 2시간을 끙끙 거렸는데..
알고보니 공백....
 << 이놈의 공백.. ㅠㅠ

by 피요히코~ 2010. 9. 28. 20:41