Which of the following extracts of code is more efficient / overall better?
Original message was deleted
Drawback: temporarily holds firstList and secondList in memorynot true, as .Where is lazy and wont be evaluated until
FirstOrDefault is ran on it. It will however be evaluated twice if the first FoD returns null.temporarily holds evaluation of .Where in memory before calling .FirstOrDefaultcountry before it does for Constants.ALL_COUNTRIESmainList large?
.Where(x => ...).FirstOrDefault() can be re-written as just .FirstOrDefault(x => ...)Linq all together. Method 1 is better, although you should evaluate these two enumerations.FirstOrDefaultFoDtemporarily holds evaluation of .Where in memory before calling .FirstOrDefaulttemporarily holds firstList and secondList in memory
temporarily holds evaluation of .Where in memory before calling .FirstOrDefaultcountryConstants.ALL_COUNTRIESmainList.Where(x => ...).FirstOrDefault().FirstOrDefault(x => ...)LinqMethod 1var firstItem =
_mainList.FirstOrDefault(item =>
item.Level == Level.FirstLevel
&& item.Countries.Any(c => c == country || c == Constants.ALL_COUNTRIES);var firstList = mainList.Where(item => item.Level == Level.FirstLevel).ToArray();
var firstItem = firstList.FirstOrDefault(item => item.Countries.Contains(country, StringComparer.InvariantCultureIgnoreCase))
?? firstList.FirstOrDefault(item => item.Countries.Contains(Constants.ALL_COUNTRIES));var firstList = _mainList.Where(item => item.Level == Level.FirstLevel);
var secondList = _mainList.Where(item => item.Level == Level.SecondLevel);// this will eveluate the linq statement above for firstList
// twice when the first parameter is null
var firstItem = firstList.FirstOrDefault(item => item.Countries.Contains(country, StringComparer.InvariantCultureIgnoreCase))
?? firstList.FirstOrDefault(item => item.Countries.Contains(Constants.ALL_COUNTRIES));
// the same applies to this as well
var secondItem = secondList.FirstOrDefault(item => item.Countries.Contains(country, StringComparer.InvariantCultureIgnoreCase))
?? secondList.FirstOrDefault(item => item.Countries.Contains(Constants.ALL_COUNTRIES));// Note the ToList(), forces enumeration and stores result in List
var firstList = _mainList.Where(item => item.Level == Level.FirstLevel).ToList();
var secondList = _mainList.Where(item => item.Level == Level.SecondLevel).ToList();
var firstItem = firstList.FirstOrDefault(item => item.Countries.Contains(country, StringComparer.InvariantCultureIgnoreCase))
?? firstList.FirstOrDefault(item => item.Countries.Contains(Constants.ALL_COUNTRIES));
var secondItem = secondList.FirstOrDefault(item => item.Countries.Contains(country, StringComparer.InvariantCultureIgnoreCase))
?? secondList.FirstOrDefault(item => item.Countries.Contains(Constants.ALL_COUNTRIES));