CCCPaste
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
public class PL
{
string name;
int P1, P2, P3;

public PL()
{
name = "";
P1 = P2 = P3 = -1;
}

public PL(string name, int p1, int p2, int p3)
{
this.name = name;
P1 = p1;
P2 = p2;
P3 = p3;
}

public string getName()
{
return name;
}

public int getP1()
{
return P1;
}

public int getP2()
{
return P2;
}

public int getP3()
{
return P3;
}

public void setName(string name)
{
if (name == null)
{
Console.WriteLine("No name passed!");
return;
}

this.name = name;
}

public void setP1(int p1)
{
if (p1 < 0)
{
Console.WriteLine("P1 is negative");
return;
}

P1 = p1;
}

public void setP2(int p2)
{
if (p2 < 0)
{
Console.WriteLine("P2 is negative");
return;
}

P2 = p2;
}

public void setP3(int p3)
{
if (p3 < 0)
{
Console.WriteLine("P3 is negative");
return;
}

P3 = p3;
}
}

internal class Program
{
static void Read(string filename, PL[] PLS, ref int n)
{
string line;
using (StreamReader reader = new StreamReader(filename))
{
while ((line = reader.ReadLine()) != null)
{
string[] parts = line.Split(';');
string name = parts[0].Trim();
int P1 = int.Parse(parts[1].Trim());
int P2 = int.Parse(parts[2].Trim());
int P3 = int.Parse(parts[3].Trim());
PLS[n] = new PL(name, P1, P2, P3);
n++;
}
}
}

static void Print(string filename, string note, PL[] PLS, int n)
{
using (StreamWriter writer = new StreamWriter(filename, true))
{
writer.WriteLine(note);
writer.WriteLine(new string('-', 50));
writer.WriteLine("| Name | P1 | P2 | P3 |");
writer.WriteLine(new string('-', 50));
for (int i = 0; i < n; i++)
writer.WriteLine("{0, -8} {1, -4} {2, -4} {3, -4}", PLS[i].getName(), PLS[i].getP1(), PLS[i].getP2(), PLS[i].getP3());
writer.WriteLine(new string('-', 50));

}
}

static int FindPrizeWinner(PL[] PLS, int n, int position)
{
int ind = -1;
for (int i=0; i < n; i++)
if (PLS[i].getP1() <= position && PLS[i].getP2() <= position && PLS[i].getP3() <= position)
ind = i;
return ind;
}

static void CreateCollection(PL[] PLS, int n, PL[] NewC, ref int newn, PL Last)
{
for (int i=0; i < n; i++)
if (PLS[i].getP1() < Last.getP1())
NewC[newn++] = new PL(PLS[i].getName(), PLS[i].getP1(), PLS[i].getP2(), PLS[i].getP3()); // -> for deep copy
// NewC[newn++] = PLS[i]; -> for shallow copy
}

static void Main(string[] args)
{
const int maxSize = 100;
const string fd = "ProgrammingLanguages.txt";
const string fr = "Results.txt";

if (File.Exists(fr))
File.Delete(fr);

int n = 0;
PL[] PLS = new PL[maxSize];
Read(fd, PLS, ref n);
Print(fr, "Initial data:", PLS, n);

int position;
Console.WriteLine("Enter position:");
position = int.Parse(Console.ReadLine().Trim());
int prizeWinnerInd = FindPrizeWinner(PLS, n, position);

int newn = 0;
PL[] newC = new PL[maxSize];
PL Last = PLS[n - 1];
CreateCollection(PLS, n, newC, ref newn, Last);

using (StreamWriter writer = new StreamWriter(fr, true))
{
writer.WriteLine("\n");
writer.WriteLine("{0, -8} {1, -4} {2, -4} {3, -4}", PLS[prizeWinnerInd].getName(), PLS[prizeWinnerInd].getP1(), PLS[prizeWinnerInd].getP2(), PLS[prizeWinnerInd].getP3());
writer.WriteLine("\n");
}

Print(fr, "New collection:", newC, newn);
}
}
}