2010-10-08 4 views
1

Il semble que .net 2.0 ne prennent pas en charge OrderByDescending pour les clés de dictionnaire, comment puis-je changer ce code .net 2,0Changer le code à Net 2.0

private static Dictionary<byte[], Func<BinaryReader, Size>> imageFormatDecoders = new Dictionary<byte[], Func<BinaryReader, Size>>() 
{ 
    { new byte[]{ 0x42, 0x4D }, DecodeBitmap}, 
    { new byte[]{ 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }, DecodeGif }, 
    { new byte[]{ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }, DecodeGif }, 
    { new byte[]{ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }, DecodePng }, 
    { new byte[]{ 0xff, 0xd8 }, DecodeJfif }, 
}; 


public static Size GetDimensions(BinaryReader binaryReader) 
    { 
     int maxMagicBytesLength = imageFormatDecoders.Keys.OrderByDescending(x => x.Length).First().Length; 
     byte[] magicBytes = new byte[maxMagicBytesLength]; 
     for (int i = 0; i < maxMagicBytesLength; i += 1) 
     { 
      magicBytes[i] = binaryReader.ReadByte(); 
      foreach (var kvPair in imageFormatDecoders) 
      { 
       if (magicBytes.StartsWith(kvPair.Key)) 
       { 
        return kvPair.Value(binaryReader); 
       } 
      } 
     } 
     throw new ArgumentException(errorMessage, "binaryReader"); 
    } 
+0

Hein? L'appel OrderByDescending devrait être bien dans .NET 3.5 ... mais pourquoi voudriez-vous passer à 2.0 pour résoudre le problème? Et d'où voulez-vous que «byte []. StartsWith' vienne? –

+0

@oded - ressemble à une directive * manquante * –

+0

@Marc - Merci pour la correction :) – Oded

Répondre

0

Cette ligne

int maxMagicBytesLength = imageFormatDecoders.Keys.OrderByDescending(x => x.Length).First().Length; 

obtient juste la longueur du tableau d'octets plus long sur les touches de votre dictionnaire. Il suffit donc de parcourir vos articles en imageFormatDecoders et enregistrer la valeur la plus longue, à savoir, quelque chose comme ça (non testé):

int maxMagicBytesLength = 0; 
foreach (byte[] magicBytes in imageFormatDecoders.Keys) { 
    if (magicBytes.Length > maxMagicBytesLength) 
     maxMagicBytesLength = magicBytes.Length; 
} 
+0

Salut, merci, vous êtes dans le bon chemin, mais comment puis-je gérer byte []. StartsWith dans dot net 2.0? – Ata

+0

@Ata: Déplace la boucle foreach en dehors de la boucle for. Dans la boucle foreach, créez une boucle qui compare les premiers éléments 'kvPair.Key.Length'. – Heinzi

0

Que voulez-vous dire que .net 3.5 ne prend pas en charge OrderByDescending. Cela fait. Et en passant, quel est le problème avec Max(x => x.Length)?

+0

Salut, merci, pouvez-vous expliquer ce que vous voulez utiliser pour cela? – Ata

+0

@Ata: 'int maxMagicBytesLength = imageFormatDecoders.Keys.Max (x => x.Length)'. –

+0

Est-ce que .net supporte cela? – Ata

0

Quel est le problème avec ceci, dans .Net 3.5?

Dictionary<int, int> dict = new Dictionary<int, int>(); 
dict[0] = 2; 
dict[1] = 3; 

foreach (var item in dict.OrderByDescending(key => key.Value)) 
{ 
    Console.WriteLine(item.Key); 
    Console.WriteLine(item.Value); 
} 

Sortie

2

Je suppose que vous manque simplement;

using System.Linq; 

En haut du fichier de code. Et non, passer à .net 2 ne va pas aider ici.

+0

Cela a du sens. –