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

  • 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. – JonasH Apr 06 '22 at 14:25
  • See also [What is Sliding Window Algorithm? Examples?](https://stackoverflow.com/questions/8269916/what-is-sliding-window-algorithm-examples) – JonasH Apr 06 '22 at 14:28

1 Answers1

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);
  }
}
user2147873
  • 107
  • 5
  • Yes .NET 6 is shipped with such a function: [Chunk](https://learn.microsoft.com/en-us/dotnet/api/system.linq.enumerable.chunk) – ckuri Apr 06 '22 at 16:33