How to check if there is a specific data in a multidimensional array C#

Asked

Viewed 630 times

2

Work in a school that makes the students frequency control by digital, each time a student "hits" the finger is added to a code to a txt, if the student hit 1 time is recorded input if he hit 2 times is marked input and output, I was able to read the text and save the data in the array Todosapontamento[12,31,X] that in the serious case Month and day, now I need to check if each student hit once or twice in the day

I made a script to save data from a txt in a multidimensional array, each line of txt contains a code that is saved in the array, I need to check if that code appears twice in the same array index, for example: array[dia,mes, code] but I don’t know how to do this, Obs: I also made a list to save the data in the database in the future.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MetroFramework;
using MetroFramework.Forms;
using System.IO; //declarando a biblioteca de entrada e saída de arquivos
                 //a biblioteca IO

namespace Pj_FrquenciaObjetivo
{
    public partial class TratarDados : MetroFramework.Forms.MetroForm
    {
        public TratarDados()
        {
            InitializeComponent();
        }

        private void TratarDados_Load(object sender, EventArgs e)
        {
            try
            {
                int  qtMaxima = 0;
                int  Coutap = 0;


                //declarando a variavel do tipo StreamWriter 
                StreamReader x;

                //Colocando o caminho fisico 
                string Caminho = "C:\\Apontamento\\Apontamento.txt";

                //abrindo um arquivo texto
                x = File.OpenText(Caminho);
                while (x.EndOfStream != true)//quer dizer que não chegou no fim do  
                                             //arquivo
                {
                    string linha2 = x.ReadLine();

                    if (linha2 == "")
                    {
                        x.Close();
                        break;

                    }
                    qtMaxima++;

                }
                string[,,] TodosApontamento = new string[12,31, qtMaxima];

                x = File.OpenText(Caminho);
                string recuperaDia ="", recuperaMes ="";

                //enquanto nao retornar valor booleano true 
                while (x.EndOfStream != true)//quer dizer que não chegou no fim do  
                                             //arquivo
                {

                    //le conteúdo da linha
                    string linha = x.ReadLine();


                    //escreve na tela o conteúdo da linha
                    // Aqui eu devo salvar o texto em pedaços para
                    // que eu possa criar o obj apontamento
                    string status = linha.Substring(0, 2);
                    string dia = linha.Substring(2, 2);
                    string mes = linha.Substring(4, 2);
                    string ano = linha.Substring(6, 4);
                    string hora = linha.Substring(10, 2);
                    string minuto = linha.Substring(12, 2);
                    string segundo = linha.Substring(14, 2);
                    string matricula = linha.Substring(16, 5);

                    if (recuperaMes==mes && recuperaDia==dia)
                    {
                        Coutap = 0;
                    }
                    while (TodosApontamento[int.Parse(mes), int.Parse(dia), Coutap] !=null)
                    {
                        Coutap++;
                    }
                    TodosApontamento[int.Parse(mes),int.Parse(dia), Coutap] = linha;
                    Apontamento apm = new Apontamento(status, dia, mes, ano, hora, minuto, segundo, matricula);  
                    Controller.CarregaApontamentos(apm);

                  //  MessageBox.Show("Mes: "+int.Parse(mes)+" - Dia: "+ int.Parse(dia) + " - Arrey : "+Coutap +" - Conteudo: "+ TodosApontamento[int.Parse(mes), int.Parse(dia), Coutap]) ;
                    Coutap++;
                    recuperaDia = dia;
                    recuperaMes = mes;
                }

                //após sair do while, é porque leu todo o conteúdo, então
                //temos que fechar o arquivo texto que está aberto
                x.Close();
            }

            catch (Exception)
            {


                MetroMessageBox.Show(this, "Erro ao tentar adicionar na lista.", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

        }

        private void btn_voltar_Click(object sender, EventArgs e)
        {
            Home Hhome = new Home();
            this.Hide(); // use dessa maneira.
            Hhome.ShowDialog();
        }

        private void metroButton2_Click(object sender, EventArgs e)
        {

            MessageBox.Show("Apontamento criado com seucesso");
            MessageBox.Show("A quantidade de apontamentos é :" + Controller.L_apontamento1.Count());
        }
    }
}
  • I think you’d better serialize your object and save it as XML or JSON. And when you read, deserialize for object.

  • Explain your problem because you can’t understand what you want to do with the matrix.

  • you want to check if some value repeats in the same column in different rows?

  • This @Leandroangelo

  • And how you will want to indicate or present this?

  • @Marcelouchimura work in a school that makes the students frequency control by digital, each time a student "hits" the finger is added to a code to a txt, if the student hit 1 time is recorded input if he hit 2 times is marked input and output, I was able to read the text and save the data in the array Todosapontamento[12,31,X] that in the serious case Month and day, now I need to check if each student hit once or twice in the day

  • @Leandroangelo I want to do this check and if I have only 1 "note" of the same student on the day I will create a "note" and save in txt

Show 2 more comments

1 answer

1

Try it this way:

using System.Diagnostics;
using System.Linq;

at the top of the . Cs.

Create a private class within the class TratarDados,

private class Frequencia : IEquatable<Frequencia>
{
    DateTime Data { get; private set; }
    string Matricula { get; private set; }
    int QuantidadeBatidasCatraca { get; private set; }

    public Frequencia(DateTime data, string matricula) : this(data, matricula, 1)
    { }

    public Frequencia(DateTime data, string matricula, int batidas)
    {
        Data = data;
        Matricula = matricula;
        QuantidadeBatidasCatraca = batidas;
    }

    // Implementação do contrato.
    public bool Equals(Frequencia other)
    {
        return other.Data == Data &&
            other.Matricula == Matricula;
    }

    // Sobre-escreve o método padrão.
    public override int GetHashCode()
    {
        return Data.GetHashCode() ^ Matricula.GetHashCode();
    }
}   

In the method below, do the following:

private void TratarDados_Load(object sender, EventArgs e)
{
    // Lê todas as linhas do arquivo especificado.
    string[] linhas = 
        System.IO.File.ReadAllLines(@"c:\apontamento\apontamento.txt");

    // Declara uma lista de frequências.
    List<Frequencia> freqs = new List<Frequencia>();

    foreach (string linha in linhas)
    {
        string status = linha.Substring(0, 2);
        string dia = linha.Substring(2, 2);
        string mes = linha.Substring(4, 2);
        string ano = linha.Substring(6, 4);
        string hora = linha.Substring(10, 2);
        string minuto = linha.Substring(12, 2);
        string segundo = linha.Substring(14, 2);

        string matricula = linha.Substring(16, 5);
        DateTime data = 
            new DateTime(int.Parse(ano), int.Parse(mes), int.Parse(dia));

        Frequencia freq = new Frequencia(data, matricula);
        freqs.Add(freq);
    }

    // Manipula a lista de frequencias.
    var query =
        freqs
            .GroupBy(g => g)
            .Select(s => 
                new Frequencia(s.Key.Data, s.Key.Matricula, s.Count()))
            .OrderBy(o => o.Data)
            .ThenBy(t => t.Matricula);

    foreach (Frequencia f in query)
    {
        Debug.WriteLine("Data {0}, Matricula {1}, Frequencia {2}",
            f.Data, f.Matricula, f.QuantidadeBatidasCatraca);
    }
}

Debug in Visual Studio and, after running, see the Output window (Output).

Browser other questions tagged

You are not signed in. Login or sign up in order to post.