0
votes

Comment rejoindre une matrice multidimensionnelle

J'essaie de résoudre ce problème pendant des jours et je me demandais si quelqu'un pouvait aider, je suis toujours nouveau à c # afin que toute chose que vous puissiez recommander serait une bonne aide!

Ce que j'essaie de faire est de faire enregistrer un nouveau nom / marqueur dans la liste Noms / scores existants. P>

J'ai déjà essayé un certain nombre de méthodes différentes mais sans chance. P>

Heres un exemple de ce que j'essaie de FAIRE: P>

public static string[,] CombineArrayFunction(string[,] array1, string[,] array2)
{

    string[,] finalArray = new string[array1.Length + array2.Length, 2];

    Array.Resize<string[,]>(ref array1, array1.Length + array2.Length);

    Array.Copy(array2, 0, array1, array1.Length, array2.Length);

    for (int i = 0; i < finalArray.Length; i++)
    {
        finalArray[i, 0] = array1[i, 0];
        finalArray[i, 1] = array1[i, 1];
    }

    return finalArray;
}


1 commentaires

Êtes-vous obligé d'utiliser des tableaux ici ou pouvez-vous utiliser un autre type de données?


3 Réponses :


1
votes

Vous pouvez utiliser le dictionnaire. C'est beaucoup plus simple qu'un tableau multidimensionnel.

var dict1 = new Dictionary<string, string> { { "Bob", "100" } };
var dict2 = new Dictionary<string, string> { { "Dave", "200" }, { "Sam", "300" }, { "Nick", "310" } };
var combinedDict = dict1.Concat(dict2).GroupBy(d => d.Key).ToDictionary(d => d.Key, d => d.First().Value);

foreach (var item in combinedDict)
{
    Console.WriteLine($"{item.Key} - {item.Value}");
}


3 commentaires

Je ne pense pas que ce cas demande ("vous besoin utiliser dictionnaire"?) Utilisation d'un dictionnaire. Seulement que cela peut être déduit que ce serait l'une des structures les plus appropriées. Sur cette note, je pense qu'il serait approprié d'expliquer pourquoi Un dictionnaire est approprié dans des cas «personnes-données» comme celui-ci, plutôt que d'autres structures pouvant atteindre le comportement fusion seul, comme < Code> Liste .


Vous suppose , sans aucune preuve, qu'il n'y a pas de clés en douceur et s'il y en a, que vous pouvez les jeter silencieusement. Je pense que c'est une approche dangereuse.


Le nom dupliqué est un problème logique commercial. Disons que deux candidats avec le même nom ont un score de cravate. Comment les distinguons-nous quand même? Par conséquent, il est prudent de supposer qu'ils doivent entrer des noms différents.



1
votes

Vous ne pouvez pas utiliser xxx

car les éléments de votre tableau ne sont pas de type string [] . Il fonctionnerait-il si vous aviez une chaîne [] [] [] car vous pourriez alors utiliser xxx

pour les matrices multidimensionnelles là-bas est Afaik no méthode intégrée, vous devez donc le faire simplement "manuellement" xxx

peut-être que le problème principal est dans votre structure de données elle-même .


A Dictionnaire Comme mentionné par Rawitas Krungkaew pourrait Soyez une meilleure approche dans le cas où vous avez des touches uniques, car elle est également plus rapide dans l'accès si vous recherchez plus tard une valeur spécifique.


Si votre cas d'utilisation est plutôt seulement sur le stockage et par exemple Affichage de cette information quelque part, je recommanderais de préférer utiliser un type personnalisé approprié et une simple liste plate comme par exemple xxx

alors vous pouvez simplement ajouter un élément < Pré> xxx

ou si nécessaire plusieurs utilisateurs utilisant addrange xxx


Il y a beaucoup plus d'avantages de cette liste.

Par exemple, il peut être très simplement itéré sans avoir à se soucier de deux indices tout le temps.

et en particulier pour avoir une carte de score puisque vous pouvez maintenant utiliser toute la magie de linq ( à l'aide de SYSTE.LINQ; ) et filtrer et trier votre liste.

par exemple trier cette liste alphabétique xxx

ou par score xxx

ou utilisez à la fois sur le premier ordre et si l'ordre est égal à Nom xxx

ou retour toutes les entrées appartenant à "Bob" xxx

et si vous avez toujours besoin d'accéder à un certain entrée linq offre beaucoup de magie. Par exemple, trouvez le score maximum pour "bob" xxx

renvoie le score le plus élevé de "bob" ou 0 0 0 0 S'il n'y en avait pas dans la liste.


Un autre avantage de cette liste est qu'il est directement sérialisable, donc 1. Vous pouvez le voir en réalité dans l'inspecteur de l'unité. Il est sauvé si vous par exemple. Remplissez-le avec des valeurs par défaut dans l'inspecteur.

Vous pouvez également vous sévéraliser directement et le désérialiser à la plupart des formats tels que XML, JSON (pour ceux dont vous avez besoin d'une classe d'emballage pour la liste) ou simplement dans un fichier texte. avec une ligne par entrée, etc.


0 commentaires

0
votes

La matrice de deux dimensions n'est pas la meilleure structure de données pour cela (plus dans @derhugo Post). Au code réel, xxx pré>

arra1.length code> est le nombre total de tous les éléments de toutes les dimensions. Ce que vous voulez vraiment, c'est array1.getlength (0) code>. P> xxx pré>

Vous ne pouvez pas redimensionner une matrice multidimensionnelle. Si vous le pouviez, vous n'auriez pas besoin du finalArray, car redimensionner code> crée de toute façon un nouveau tableau. Mais tu ne peux pas. p> xxx pré>

array1.length code> ne contient plus la taille de la matrice d'origine. Maintenant, il renvoie la taille de la matrice redimensionnée, il s'agit donc d'un bug. P> xxx pré>

vraiment pas besoin de boucler lorsque vous pouvez utiliser array.copy code>. Voici mon code P>

public static string[,] CombineArrayFunction(string[,] array1, string[,] array2)
{
    if (array1.GetLength(1) != array2.GetLength(1))
    {
        throw new NotSupportedException("Arrays have to be the same size");
    }

    string[,] finalArray = new string[array1.GetLength(0) + array2.GetLength(0), array1.GetLength(1)];

    Array.Copy(array1, 0, finalArray, 0, array1.Length);
    Array.Copy(array2, 0, finalArray, array1.Length, array2.Length);

    return finalArray;
}


0 commentaires