0

So i have to sent a message from a Sender to a Destination(Shown in main class) by specifing how many letters i wanna sent (the size variable).When the laters left are less than letters i wanna sent,it automaticaly sent how many i have left,and after the algorithm stops;

The problem is when the message i supossely sent is 9 characters long,and when i wanna sent 6 characters and another 3 it throws me an error (System.IndexOutOfRangeException: 'Index was outside the bounds of the array.' )

using System;
using System.Text;
using System.Threading;

namespace homework
{
internal class slidingWindow
    {
        private string name;
        private StringBuilder message = new StringBuilder();
        private bool isSource = false;
        private int fin = 0;

        public slidingWindow(string name, bool isSource)
        {
            this.name = name;
            this.isSource = isSource;
        }

        public void messageSet(string _message)
        {
            if (isSource == true) message.Append(_message);
            else Console.WriteLine("Is not source");
        }

        public void sendMessage(slidingWindow destination)
        {
            int counter= 0;
            
            Console.WriteLine("Specify the size of data sent: ");
            int size = Convert.ToInt32(Console.ReadLine()); //the size of how manny letters i should send
            int countCharacterSent=size; 
       
            for (int x = 0; x < message.Length+(message.Length%size); x = x + size)
            {
                counter++; 
                for (int y = 0; y < size; y++)
                {
                    if (x + size > message.Length + (message.Length % size)) { size=size-(message.Length%size); countCharacterSent = message.Length; } 
                    
                    else {destination.message.Append(message[x + y]);  }
                    
                }
                
                Console.WriteLine("Sennder---- " + destination.message + " ----->Destination" + " (" + counter+ ")"+ "    Characters sent: "+size+  "    Characters received:  "+countCharacterSent+ '\n');
                Thread.Sleep(TimeSpan.FromSeconds(1));
                countCharacterSent = countCharacterSent + size;  
                
            }
            fin = 1;
            
            if (message.Length % size != 0) destination.fin = 1;
            destination.print();
        }

        
        public void print()
        {
            Console.WriteLine("Destination has receveid the message: " + message+"    FIN: "+fin);
        }
    }

and the main class

using System;

namespace homework
{
    class main
    {
        static void Main(string[] args)
        {
            while (true)
            {
                int option = 0;
                slidingWindow a = new slidingWindow("Sender", true);
                a.messageSet("exampless");


                slidingWindow b = new slidingWindow("Destination", false);
                a.sendMessage(b);

                Console.WriteLine("If you want to exit write 1:"+'\n');
                 option = Convert.ToInt32(Console.ReadLine());

                if (option == 1) break;
            }
        }
    }

example:

input:

message='example'

size=3;

output:

exa

mpl

e

2
  • 1
    If you have a set of [a, b, c] with a sliding window of size 2, you would get [a, b], [b, c]. From your description it sounds like you expect [a, b], [c], and this would more properly be called 'chunking' or 'batching'. So what behavior do you intend? Examples of input and expected outputs are often useful. Commented Apr 6, 2022 at 14:25
  • See also What is Sliding Window Algorithm? Examples? Commented Apr 6, 2022 at 14:28

1 Answer 1

1

Honestly I can see you try hard (too hard) to handle the limit case of the last block that can just not meet the expect size.

Since you do this in dotnet C#, and depending on the version you will see you have many different options....

Especially to create a batch of x out of a simple sequence....

here is a homemade version of things you will find for free in libraries like moreLinq and probably in latest Linq lib..



using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq;


public static class LinqExtensions 
{
  public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source, int size)
  {
    return source
      .Select( (c, i) => (c, index : i))
      .Aggregate(
      new List<List<T>>(), 
      (res, c) => 
      {
        if (c.index % size == 0)
          res.Add(new List<T> { c.c });
        else 
          res.Last().Add(c.c);
        return res;
      });
  }
}

public class Program
{
  public static void Main(string[] args)
  {   
    var test = "xxxxxxxxxxx".AsEnumerable();    
    var blocks = test
        .Batch(3)
        .Select(b=> new string(b.ToArray())); 
    
    blocks.ToList().ForEach(System.Console.WriteLine);
  }
}
Sign up to request clarification or add additional context in comments.

1 Comment

Yes .NET 6 is shipped with such a function: Chunk

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.