I'd say the distinction is that Rust's .min() is implemented on the equivalent of IEnumerator<T>, Iterator - instead of the equivalent of IEnumerable<T>, IntoIterator. This makes it slightly more flexible, since you can always get the former from the latter by calling GetEnumerator(), but not vicea versa (without filling a container with it first or something.)
If C# also implemented Min on IEnumerator<T>:
var enumerator = collection.GetEnumerator();
var min = enumerator.Min();
var max = enumerator.Max(); // Runtime bug: Min() already the entire enumerator! InvalidOperationException?
There's basically nothing useful you can do with 'enumerator' after the first call to this hypothetical Min. Rust's stdlib tries to catch this bug by having min take ownership of/consume 'enumerator', instead of merely borrowing it, so you can't use it again:
let iter = collection.iter();
let min = iter.min();
let max = iter.max(); // Compile time error: iter used after move
In C#, basically everything that can be is an IEnumerable<T>, and the stdlib is built around that fact. Does System.IO.File.ReadLines hit disk every time you re-enumerate it? Or does it store to a container? Many of the stream based APIs have a .ReadLine() method but no .ReadLines() method, presumably because they'd have to allocate a container to store the result in case enumerable be re-evaluated multiple times, and that seems bad if you don't need it?
Rust seems to lean a lot more heavily on single-shot iterators.
let lines = stdin.lock().lines();
for line in lines { ... }
for line in lines { ... } // Compile time error: lines moved.
let lines = BufReader::new(File::open("input.tsv")?).lines();
for line in lines { ... }
for line in lines { ... } // Compile time error: lines moved.
"Does lines() hit disk/stdin every time you re-enumerate it?" is a trick question: You
can't re-enumerate it.
You can resolve these errors by being explicit about storing the input in a container and iterating that multiple times, or by re-opening the input file, or by resetting the File position and constructing a new BufReader, depending on which behavior you wanted for re-enumeration.