2017-11-20 14 views
0

필자는 연관성이없는 필드 값으로 그룹화하는 연관 컨테이너에 넣으려는 객체가 있습니다. 나는 다음과 같은했다 그래서 경우 :비교할 수없는 개체를 그룹화하는 SortedSet 형 컨테이너가 있습니까?

using System.Collections.Generic; 
using Pair = System.Tuple<Penguin, int>; 

class Penguin {} 

class Whatever { 

    public static void Main(string[] args) { 
     Penguin emperor = new Penguin(), 
       adelie = new Penguin(), 
       batmanVillain = new Penguin(); 

     var okay = new HypotheticalCollection<Pair>(5); 

     okay.Add(new Pair(emperor, 1)); 
     okay.Add(new Pair(adelie, 2)); 
     okay.Add(new Pair(batmanVillain, 3)); 
     okay.Add(new Pair(emperor, -500)); 
     okay.Add(new Pair(batmanVillain, 5)); 

    } 
} 

을하고 난 HypotheticalCollection을 통해 반복, 내가 함께 함께 두 emperor 항목과 두 batmanVillain 항목을보고 싶어,하지만 내가 먼저 어느 쪽의를 걱정하지 않는다. 그러나 로그 시간에 항목을 조회 할 수 있기를 원합니다.

C++을 사용하는 경우 해당 주소로 Penguin을 정렬 하겠지만 C#에는 그 고급 기능이 없습니다. 지금은 각 객체에 일련 번호를 지정하여 처리하고 있지만 해피가 느껴지고 여분의 공간이 필요하지 않습니다. 더 좋은 방법이 있습니까, 아마도 ReferenceLessThan 기능 또는 뭔가?

+0

[비교 자] (https://stackoverflow.com/questions/14336416/using-icomparer-for-sorting)를 쓰지 않는 이유는 무엇입니까? 생성 한 후에는 SortedSet [생성자] (https://msdn.microsoft.com/en-us/library/dd395024(v=vs.110) .aspx)로 전달할 수 있습니다. – john

답변

1

옵션 1 : (제안)

public static class Whatever 
{ 
    class Penguin 
    { 
     private Guid id = Guid.NewGuid();  
     public Guid GetId() { return id; } 
    } 

    public static void Main(string[] args) 
    { 
     Penguin emperor = new Penguin(), 
      adelie = new Penguin(), 
      batmanVillain = new Penguin(); 

     var okay = new List<KeyValuePair<Penguin, int>>(); 
     okay.Add(new KeyValuePair<Penguin, int>(emperor, 1)); 
     okay.Add(new KeyValuePair<Penguin, int>(adelie, 2)); 
     okay.Add(new KeyValuePair<Penguin, int>(batmanVillain, 3)); 
     okay.Add(new KeyValuePair<Penguin, int>(emperor, -500)); 
     okay.Add(new KeyValuePair<Penguin, int>(batmanVillain, 5)); 

     okay.Sort((a, b) => a.Key.GetId().CompareTo(b.Key.GetId())); 

     // Iterate 'okay' 
    } 
} 

옵션 2 this에 따른 수정 주소가 아닌 상기 CLR에 의해 변경 될 수있는 기능을 비교 정렬의 목적 주소를 사용하는 것이다. 또한 주소를 얻으려면 unsafe 플래그로 앱을 제작해야합니다. 당신이 옵션 1이 "hacky"라고 느끼면, csharaply 옵션 2는 슈퍼 "hacky"입니다. 그리고 GUID은 128 비트 정수 (16 바이트)입니다.