Il codice:
var query=(
from role in roleList
let delimiter=WorkflowConstants.WorkflowRoleDelimiter
let roleArray=role.RoleId.Split(new char[] { delimiter })
where roleArray.Length.Equals(_SplittedRoleIdArrayLength)
where HasAccessToCurrentUnit(roleArray[_UnitIndexInRoleId])
select roleArray[_LevelIndexInRoleId]
).DefaultIfEmpty("").FirstOrDefault();
Per il sospetto circa il significato semantico di DefaultIfEmpty
e FirstOrDefault
, segue è il codice decompilato dalla libreria:
Codice
public static IEnumerable<TSource> DefaultIfEmpty<TSource>(this IEnumerable<TSource> source)
{
return source.DefaultIfEmpty<TSource>(default(TSource));
}
public static IEnumerable<TSource> DefaultIfEmpty<TSource>(this IEnumerable<TSource> source, TSource defaultValue)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
return DefaultIfEmptyIterator<TSource>(source, defaultValue);
}
public static TSource First<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
IList<TSource> list = source as IList<TSource>;
if (list != null)
{
if (list.Count > 0)
{
return list[0];
}
}
else
{
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
if (enumerator.MoveNext())
{
return enumerator.Current;
}
}
}
throw Error.NoElements();
}
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
IList<TSource> list = source as IList<TSource>;
if (list != null)
{
if (list.Count > 0)
{
return list[0];
}
}
else
{
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
if (enumerator.MoveNext())
{
return enumerator.Current;
}
}
}
return default(TSource);
}
E qui sono qualcosa di parlare:
DefaultIfEmpty
ha un sovraccarico senza parametri, che invoca il sovraccarico parametrizzata con default(TSource)
e restituisce il suo risultato.
L'unica differenza tra FirstOrDefault
senza parametri e First
, è il secondo che genera quando la raccolta è vuota.
Per ulteriori informazioni, vedere Enumerable.FirstOrDefault<TSource> Method su MSDN.
FirstOrDefault
semanticamente espresso first or default
e così chiamato; non è denominato first or null
. In C#, default(T)
per un tipo di riferimento è null, ma per il tipo non di riferimento, non lo è. Ad esempio, default(int)
è zero.
La parola chiave default
non è mai stata dichiarata null semantica. È DEFAULT.
Inoltre, per ulteriori informazioni, default Keyword su MSDN.
fonte
2013-04-03 08:39:21
Personalmente non lo farei. 'DefaultIfEmpty' è interessato alle enumerables, non ai valori scalari. Crea il tuo metodo di estensione, possibilmente chiamato anche 'FirstOrDefault' che accetta un argomento' T' da specificare come predefinito. –