Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to combine simple .cs files into one .cs file with all usings at the top so it compiles

Tags:

c#

powershell

So I am aware that in general, this is not possible because Jon Skeet said so.

But my .cs files are simple classes with one or two usings at the top. And I need one file with all the classes in it so I can paste it into a web browser IDE as a single file to compile and run.

I tried using PowerShell, and just copy all files into one like this:

get-content *.cs | out-file bigBadFile.cs

But this file will not compile because it has usings in the middle, which isn't allowed:

CS1529: A using clause must precede all other elements defined in the namespace except extern alias declarations

If you are curious why I need that - it's for the CodinGame platform, and I'm sick of keeping all my code in a single file.

Sample files to merge:

GameData.cs:

using System.Collections.Generic;

public class GameData
{
    public GameData(int width, int height)
    {
       ...
    }

    public int Width { get; set; }
    public int Height { get; set; }
    public List<int> List { get; set; }
    ...
}

Player.cs:

using System;
using System.Linq;
using System.Text;
using System.Collections.Generic;

public class Player
{
    private static string[] inputs;
    private static bool isFirstTurn = true;
    public static StringBuilder MoveBuilder;

    public static GameData Game;

    static void Main()
    {
     ...
    }
}
like image 982
Lech Osiński Avatar asked Oct 26 '25 03:10

Lech Osiński


2 Answers

Just to offer a more concise and faster PSv4+ alternative to your own helpful answer:

$usings, $rest = (Get-Content *.cs).Where({ $_ -match '^\s*using\s' }, 'Split')

# Encoding note: Creates a BOM-less UTF-8 file in PowerShell [Core] 6+,
#                and an ANSI file in Windows PowerShell. Use -Encoding as needed.
Set-Content bigBadFile.txt -Value (@($usings | Select-Object -Unique) + $rest)
like image 71
mklement0 Avatar answered Oct 28 '25 18:10

mklement0


Finally I managed to do this. Those PowerShell commands worked for me:

get-content *.cs | where { $_ -match "^using" } | Select-Object -Unique | out-file bigBadFile.txt
get-content *.cs | where { $_ -notmatch "^using" } | out-file -append bigBadFile.txt

So what I do here is I take all the usings from all files and put them into bigBadFile.txt. Then I take all code without usings from all files, and append it to the bigBadFile.txt

The result is working for me, even though it has duplicated using statements. I've added | Select-Object -Unique as Theo suggested in his comment to avoid usings duplication.

After -match the code inside braces "^using" is just a regular expression, so if your usings have spaces before them in .cs files (which is unusual, you can just change this to "^[ ]*using".

like image 24
Lech Osiński Avatar answered Oct 28 '25 17:10

Lech Osiński



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!