2017-04-12 1 views
0

.net 코어를 사용하므로 System.Drawing에 액세스 할 수 없습니다. 865 색 이름 목록과 해당 16 진수 값 (0x 형식)이 있습니다. 나는 목록을 수정해야 할 필요가 없으며, 오직 한 열 (이름이나 16 진수를 검색 할 수 있음)에서 목록을 신속하게 검색 할 수 있어야합니다. 이름은 알파벳 순서대로 쉽지만 Hex는 그대로입니다. 어느쪽으로 든 상대방을 빨리 찾길 원합니다? 데이터 구조를 만드는 가장 좋은 방법은 무엇이며 어떤 검색 방법을 사용 하시겠습니까?정적 인 색상 이름 목록과 해당 16 진수 값 목록이있는 경우 가장 빠른 데이터 구조는 무엇입니까?

나는

그것은 몇 가지 흥미로운 데이터를 표시 http://cc.davelozinski.com/c-sharp/fastest-collection-for-string-lookups을 연구했지만, 그것은 단지 그렇게 아주 내가 찾고 있어요되지 어떤 하나의 열에서 검색합니다. 정렬 된 목록은 키 값으로 색상 이름 만 사용하는 경우 이동하는 방법으로 보이지만 16 진수는 약간 벗어납니다.

예 목록 : 1000 이하 행의 경우

Air superiority blue 0x72A0C1 
Alabama Crimson  0xA32638 
Alice blue 0xF0F8FF 
Alizarin crimson 0xE32636 
Alloy orange 0xC46210 
Almond 0xEFDECD 
Amaranth 0xE52B50 
Amber 0xFFBF00 
+0

이것을 확인하십시오. http://stackoverflow.com/questions/8800/best-implementation-for-key-value-pair-data-structure –

+2

두 개의 사전을 정의하는 것을 선호합니다. 첫 번째는 이름을 키로 사용하고 두 번째 키는 키로 사용합니다. –

+0

_thread-safe_가 필요합니까? – MickyD

답변

-1

-

1) - 옛날 식 사전 (아마도 가장 쉬운 방법) -이 연산 능력에서 무시할 수있을 것입니다 당신이해야 할 결정 어떤 식 으로든 - hxxps : //msdn.microsoft.com/en-us/library/xfhwa508.aspx

가장 좋은 방법은 아닙니다. 응용 프로그램에 데이터 테이블을 사용하여 정적 클래스를 만듭니다. hxxps : //msdn.microsoft.com/en-us/library/system.data.datatable(v=vs. 110) .aspx

클래스가 인스턴스화 될 때 하드 코드 할 수도 있고 별도의 데이터 소스에서 가져올 수도 있습니다 (실제로 성능에 대해 우려하고 값을 하드 코딩 할 경우). hxxps : 당신이 전체 SELECT 문을 사용하여 행 반환 할 수 있습니다이 방법을 사용

//msdn.microsoft.com/en-us/library/det4aw50 (V = vs.110는)

를 .aspx로

예 :

DataTable Table = class.datatable(); 
// Datatable class created with 2 columns: color,hex 
string expression = "color = Almond"; //or "hex = 0xEFDECD" 
DataRow[] foundRows; 
foundRows = Table.Select(expression); 

foundrows [0] 아몬드 foundRows [1] 16 진수 값을 같게한다 같을 것이다

사용자뿐만 아니라 정적 JSON 객체 또는 배열과 동일한 작업을 수행하고 사용할 수 LINQ 검색하려면 : hxxp : //newtonsoft.com/json/help/html/QueryingLINQtoJSON.htm

세 가지 성능을 비교하는 것이 좋겠지 만 1000 행 미만인 경우 - 전체 데이터 세트에 대한 성능 테스트를 실제로하지 않고 ... 나는 사지에 나가서 가장 쉽고 빠른 성능 현명한 사전입니다.

참고 : 내 순위는 10 미만입니다. 링크에서 'hxxp'를 'http'로 바꿔야합니다.

+0

.NET에 DataTable 또는 DataRow가 없습니다 – Digicoder

+0

https://www.nuget.org/packages/DataTables.AspNet.Core/ - 다른 것을 구합니다. "Microsoft"게시 패키지는 아니지만 .NET에서 데이터 테이블을 사용할 수있는 옵션이 있습니다. :) - 첫 번째 문장에서 '코어'라는 단어를 찾지는 못했지만 ADD를 사용하십시오. – JTStuedle

5

정적 목록 (변경 사항이 너무 적기 때문에 무시할 수 있음)이 있으며 즉각적인 초고속 액세스가 필요한 경우 많은 간단한 C# 기능 중 하나를 사용할 수 있습니다. 두 가지 주요 옵션 인 switch 또는 Dictionary을 요약하려면 가장 빠른 방법은 두 개 각각 두 개가 필요합니다.

당신은 당신을위한 코드를 생성하는 프로그램을 사용할 수 있지만 다음과 같은 예는 다음과 같습니다

스위치/케이스

첫 번째 예는 간단합니다, 두 가지 방법, GetHexFromNameGetNameFromHex 및 구축 switch 진술.

public static int GetHexFromName(string name) 
{ 
    switch (name) 
    { 
     case "Amaranth": 
      return 0xE52B50; 
     case "Amber": 
      return 0xFFBF00; 
     // Remaining 863 colors 
     default: 
      throw new ArgumentException(); 
    } 
} 

public static string GetNameFromHex(int hex) 
{ 
    switch (hex) 
    { 
     case 0xE52B50: 
      return "Amaranth"; 
     case 0xFFBF00: 
      return "Amber"; 
     // Remaining 863 colors 
     default: 
      throw new ArgumentException(); 
    } 
} 

충분히 쉽습니다. Roslyn은 코드를 생성 할 수있는 빠른 도구를 만들 수 있습니다.

전화 번호는 GetHexFromName(colorName)입니다. 액세스가 조금 더 읽는

사전

이것은 아마 내가 함께 갈 것입니다 방법입니다.

public static readonly ReadOnlyDictionary<string, int> Hex = new ReadOnlyDictionary<string, int>(new Dictionary<string, int> { 
    ["Amber"] = 0xE52B00, 
    ["Amaranth"] = 0xFFBF00, 
    // Remaining 863 
}); 

public static readonly ReadOnlyDictionary<int, string> Name = new ReadOnlyDictionary<int, string>(new Dictionary<int, string> { 
    [0xE52B00] = "Amber", 
    [0xFFBF00] = "Amaranth", 
    // Remaining 863 
}); 

이것은 Hex[colorName]으로 읽습니다.

이 중 하나를 조정하여 16 진수를 문자열 형식으로 지정하는 것이 쉽습니다. ReadOnlyDictionarySystem.Collections.dll 라이브러리의 System.Collections.ObjectModel 네임 스페이스에 있습니다. .NET 코어 버전 이 없으므로 코드에서 생략해야 할 수 있습니다. 어느 누구도 Dictionary 유형의 메소드를 호출하지 않을 것입니다. 또한 C# 6.0 구문에 대해 작성했습니다. 사용자 환경에 맞게 변경해야 할 수도 있습니다.


특히 목록이 자주 (또는 전혀) 변경되지 않는 경우 가장 빠른 옵션입니다. 유일한 문제점은 유지 보수성이지만 일반적으로 유지 보수성, 성능, 단순성 중 하나를 희생합니다. 여기에 유지 관리 기능이 약간 희생되었지만 성능은 개로 개입니다. 또한

,별로 중요하지 이러한 경우 중 하나에 있어야하기 위해 다음 switch 옵션에서 컴파일러는 지터와 Dictionary 구현 구조를 최적화하는 Dictionary 옵션에 최적의 코드를 (우리가 희망을) 생성합니다. 이 중 하나에서 읽는 것은 일 것입니다.

+2

@MickyD 스위치와 [사전 액세스] (https://msdn.microsoft.com/en-us/library/9tee9ht2 (v = vs.110) .aspx)는 O (1)로 프레임 워크에 문서화되어 있습니다. (스위치는 O (1)로 문서화되지 않을 수도 있지만, 대부분의 플랫폼에서 O (1)이있는 하나의 명령어 인 점프 테이블을 구성합니다. –

+0

우수함. 감사합니다 – MickyD

+0

추악하지만, 나는 당신이 무슨 뜻인지 안다. 이 경우에는 실제로 편집이 끝난 후에는 아무런 의미가 없습니다. 내가 제안한 사전 방법이 마음에 듭니다. 그래서 그 길로 갈 것입니다. 이것은 하나의 파일입니다. 나는 그 파일이 끝난 후에 다시 열어 볼 필요가 없다고 생각합니다! *노트* - .NET 코어는 콜렉션을 가지고 있으며 우리는 ObjectModel을 사용할 수 있습니다. – HappyCamp

관련 문제