Calculate GS1 / SSCC / UPC check digit
It looks good!  I only have some minor suggestions.  You might want to not have the LINQ expression all on one line.  Right now I have to scroll to see it all.

An alternative is to use Enumerable.Range() to create a range of indexes:

public static int GetGTINCheckDigitUsingRange(string code)
{
    var reversed = code.Reverse().ToArray();
    var sum = Enumerable
        .Range(0, reversed.Count())
        .Sum(i =&gt; (int)char.GetNumericValue(reversed[i]) * (i % 2 == 0 ? 3 : 1));        
    return (10 - sum % 10) % 10;
}


Another alternative is to use query syntax:

public static int GetGTINCheckDigitUsingQuery(string code)
{
    var reversed = code.Reverse().ToArray();
    var sum = 
       (from i in Enumerable.Range(0, reversed.Count())
        let digit = (int)char.GetNumericValue(reversed[i])
        select digit * (i % 2 == 0 ? 3 : 1)).Sum();
    return (10 - sum % 10) % 10;
}


I think your version three is still better than my alternatives, but you might prefer one of them.  Enumerable.Range() is nice for replacing for loops, and query syntax is nice for declaring intermediate values (like digit) and replacing nested loops.  But the Select() method that takes a lambda that includes the index as a parameter is very nice for this situation.  With enough practice you can get to the point where your code looks like version three right away.  I rarely write loops anymore.  I actually find them tougher to write because they make you focus more on "how" than "what".