A number of years ago, I was helping someone on DaniWeb with some code that was (probably) more than they expected.
I never got closure on the code because it seemed the requester didn’t understand to use Visual Studio.
ANYWAY:
I recently revisited that code and realized how differently I would have done things if I created it today.
It’s like that old cartoon from NotInventedHere.com on 4/20/2010 where one character can’t stand to see his old code:

Well, I had the same reaction to mine (as I frequently do) and so I rewrote portions of it.
Luckily, it was short and I knew SPECIFICALLY what I wanted done (for now).
I figured I’d go ahead and post it for future reference (when I once again can’t stand it).
This code puts into practice multiple techniques for using Linq and IEnumerable in C++/CLI.
The program itself is a simple shell-program where the user has a command-line and can enter
some simple commands.
This was probably someone’s homework, but the implementation I demonstrated might not have been
something he/she could have turned in. LOL.
// DW_393014.cpp : main project file.
#include "stdafx.h"
using namespace System;
using namespace System::Collections::Generic;
using namespace System::IO;
using namespace System::Linq;
public ref class CCommands
{
private:
//
static void _doShowDir(void)
{
Console::WriteLine(
String::Join("\r\n",
Enumerable::ToArray<String^>(
Directory::GetFiles(
Directory::GetCurrentDirectory()))));
}
//
static void _doHelp()
{
Console::WriteLine("Commands are: " +
String::Join(", ",
Enumerable::ToArray<String^>(
Enumerable::Select(arr_kvp_s2aCommands, getKeyFromKvpS2a))) + ", quit, exit");
}
//
static Action^ _getActFromKvpS2aJoin(KeyValuePair<String^, Action^> kvpS2a, String^) { return kvpS2a.Value; }
//
static Action^ _clear = gcnew Action(Console::Clear);
static Action^ _help = gcnew Action(_doHelp);
static Action^ _showDir = gcnew Action(_doShowDir);
//
static String^ _getKeyFromKvpS2a(KeyValuePair<String^, Action^> kvp_s2a) { return kvp_s2a.Key; }
static String^ _getStringAsString(String^ str) { return str; }
//
static bool _notNothing(Action^ act) { return nullptr != act; }
static void _doNothing(){}
public:
static Func<KeyValuePair<String^, Action^>, String^>^ getKeyFromKvpS2a =
gcnew Func<KeyValuePair<String^, Action^>, String^>(_getKeyFromKvpS2a);
static Func<String^, String^>^ getStringAsString = gcnew Func<String^, String^>(_getStringAsString);
static Func<KeyValuePair<String^, Action^>, String^, Action^>^ getActFromKvpS2aJoin =
gcnew Func<KeyValuePair<String^, Action^>, String^, Action^>(_getActFromKvpS2aJoin);
static String^ NowTime(DateTime^ dt)
{
return String::Format("{0}:{1}:{2}",
dt->Hour.ToString("D2"),
dt->Minute.ToString("D2"),
dt->Second.ToString("D2"));
}
//
static IEnumerable<KeyValuePair<String^, Action^>>^ arr_kvp_s2aCommands =
gcnew array<KeyValuePair<String^, Action^>>
{
KeyValuePair<String^, Action^>("spy", _showDir),
KeyValuePair<String^, Action^>("wipe", _clear),
KeyValuePair<String^, Action^>("help", _help),
};
static Action^ DoNothing = gcnew Action(_doNothing);
static Func<Action^, bool>^ IsSomething = gcnew Func<Action^, bool>(_notNothing);
};
int main(void)
{ //array<System::String ^> ^args)
Console::WriteLine(L"Welcome to CLI Shell (v1.0)\n");
array<String^>^ arr_strQuitExit = { "exit", "quit" };
String^ strCommand = "";
while (!Enumerable::Contains<String^>(arr_strQuitExit, strCommand))
{
Console::Write("{0}>: ", CCommands::NowTime(DateTime::Now));
strCommand = Console::ReadLine()->ToLower();
//////////////////////////////////////////////////////////////////////////////
// Invoke the first non-null Action that matches the command
// If no match, call the DoNothing action.
Enumerable::First<Action^>
( // construct pieces ensures no nulls
gcnew array <Action^>
{ // [0]=desired command, [1]=fall-back
Enumerable::FirstOrDefault<Action^>
( // returns nullptr if no matching command
Enumerable::Join<KeyValuePair<String^, Action^>, String^, String^, Action^>
(
CCommands::arr_kvp_s2aCommands,
gcnew array <String^> { strCommand }, // array of 1
CCommands::getKeyFromKvpS2a, // get the Key (string)
CCommands::getStringAsString, // return the string
CCommands::getActFromKvpS2aJoin // (KVP, STR) => KVP->Key
)
),
CCommands::DoNothing // when no match or nullptr
},
CCommands::IsSomething // not nullptr
)->Invoke();
}
//
return 0;
}