<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Von Cunningham</title>
    <description>The latest articles on DEV Community by Von Cunningham (@von_cunningham).</description>
    <link>https://dev.to/von_cunningham</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3687801%2F404c60eb-29b8-4b91-bff4-d4dda66f2315.png</url>
      <title>DEV Community: Von Cunningham</title>
      <link>https://dev.to/von_cunningham</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/von_cunningham"/>
    <language>en</language>
    <item>
      <title>Why I Trade the Terminal for a GUI: A Dev’s Take on GitKraken</title>
      <dc:creator>Von Cunningham</dc:creator>
      <pubDate>Wed, 31 Dec 2025 19:40:57 +0000</pubDate>
      <link>https://dev.to/von_cunningham/why-i-trade-the-terminal-for-a-gui-a-devs-take-on-gitkraken-3cfe</link>
      <guid>https://dev.to/von_cunningham/why-i-trade-the-terminal-for-a-gui-a-devs-take-on-gitkraken-3cfe</guid>
      <description>&lt;p&gt;In the world of software engineering, there’s a long-standing "tough guy" trope: real developers only use the command line (CLI) for Git. &lt;/p&gt;

&lt;p&gt;For years, I followed that rule. But as I moved into more complex enterprise .NET and Azure environments, I realized something. My job isn't to memorize CLI flags—it’s to solve puzzles and ship reliable code. That’s why I switched to &lt;strong&gt;GitKraken&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Visualizing the "LEGO Set"
&lt;/h3&gt;

&lt;p&gt;I’ve always been a fan of LEGO Technic. When you're building a complex gearbox, you need to see how the gears mesh. &lt;/p&gt;

&lt;p&gt;Branching in a high-velocity team is the same. When you have multiple developers merging into a &lt;code&gt;main&lt;/code&gt; branch while maintaining &lt;code&gt;feature&lt;/code&gt; branches, the CLI can feel like building a LEGO set in the dark. GitKraken’s visual commit graph gives me a 30,000-foot view of the project's history, making it nearly impossible to lose a commit.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Power of the "Undo" Button
&lt;/h3&gt;

&lt;p&gt;We've all been there: a &lt;code&gt;git reset --hard&lt;/code&gt; that went slightly wrong. In the CLI, that's a heart-attack moment. In GitKraken, there is a literal "Undo" button for almost every local action. &lt;/p&gt;

&lt;p&gt;This doesn't make a developer "lazy"; it makes them &lt;strong&gt;safe&lt;/strong&gt;. It allows me to experiment with complex rebases or cherry-picks with the confidence that I can revert a mistake in one click.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Focus on the Code, Not the Syntax
&lt;/h3&gt;

&lt;p&gt;I spend my day solving complex LINQ queries and architecting Azure integrations. I want my "brain cycles" to go toward business logic, not remembering the specific syntax for a complex stash-pop or a multi-branch merge. &lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;The CLI is a powerful tool, and every dev should know the basics. But for daily enterprise work, I choose the tool that reduces cognitive load. GitKraken isn't a crutch; it's a high-definition lens for my version control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What about you? Are you a CLI purist, or have you embraced the GUI?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>productivity</category>
      <category>career</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Clean Up Your C# Loops: Flattening Nested Collections with LINQ SelectMany</title>
      <dc:creator>Von Cunningham</dc:creator>
      <pubDate>Wed, 31 Dec 2025 18:42:57 +0000</pubDate>
      <link>https://dev.to/von_cunningham/clean-up-your-c-loops-flattening-nested-collections-with-linq-selectmany-32d1</link>
      <guid>https://dev.to/von_cunningham/clean-up-your-c-loops-flattening-nested-collections-with-linq-selectmany-32d1</guid>
      <description>&lt;p&gt;Have you ever dealt with a "List within a List" and found yourself writing messy nested &lt;code&gt;foreach&lt;/code&gt; loops just to get to the data? &lt;/p&gt;

&lt;p&gt;As a developer who loves puzzles (and LEGO Technic!), I’m always looking for ways to simplify complex structures. In C#, the &lt;code&gt;.SelectMany&lt;/code&gt; operator is one of the most elegant ways to "flatten" these nested collections into a single, usable stream.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;Imagine you have a list of &lt;strong&gt;Orders&lt;/strong&gt;, and each order contains a list of &lt;strong&gt;LineItems&lt;/strong&gt;. If you want a single list of every item sold across all orders, the traditional way looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;allItems&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;LineItem&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LineItems&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;allItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works, but it's "noisy." It’s hard to read at a glance.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution: SelectMany
&lt;/h3&gt;

&lt;p&gt;With LINQ, we can achieve the same result in a single line of code. Think of SelectMany as a way to reach into each parent object, grab the child collection, and spread it out on the table.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;allItems&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SelectMany&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LineItems&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why this is better
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Readability&lt;/strong&gt;: You state what you want to do, not how to loop through it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chainability&lt;/strong&gt;: You can immediately add a &lt;code&gt;.Where()&lt;/code&gt; or &lt;code&gt;.OrderBy()&lt;/code&gt;after the &lt;code&gt;.SelectMany&lt;/code&gt; to further refine your data without adding more loops.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you’re moving from a "loop-heavy" style to a more functional approach in .NET, SelectMany is a tool you'll reach for constantly!&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
