Вы могли бы интегрировать его с помощью RazorEngine, доступного из Codeplex . Это позволяет обрабатывать бритву за пределами MVC. Хотя вы не получаете все функции, которые вы получаете из версии Razor MVC, например @Html
и @Url
и другие.
Я предполагаю у вас есть IEnumerable, и в вашем примере делегата вы хотите, чтобы c1 и c2 ссылались на два элемента в этом списке?
Я считаю, что вы могли бы достичь этого с помощью самостоятельного соединения var DifferentResults = от c1 в myList присоединиться к c2 в myList на
Я использовал кое-что, что хорошо сработало для меня.
/// <summary>
/// A class to wrap the IEqualityComparer interface into matching functions for simple implementation
/// </summary>
/// <typeparam name="T">The type of object to be compared</typeparam>
public class MyIEqualityComparer<T> : IEqualityComparer<T>
{
/// <summary>
/// Create a new comparer based on the given Equals and GetHashCode methods
/// </summary>
/// <param name="equals">The method to compute equals of two T instances</param>
/// <param name="getHashCode">The method to compute a hashcode for a T instance</param>
public MyIEqualityComparer(Func<T, T, bool> equals, Func<T, int> getHashCode)
{
if (equals == null)
throw new ArgumentNullException("equals", "Equals parameter is required for all MyIEqualityComparer instances");
EqualsMethod = equals;
GetHashCodeMethod = getHashCode;
}
/// <summary>
/// Gets the method used to compute equals
/// </summary>
public Func<T, T, bool> EqualsMethod { get; private set; }
/// <summary>
/// Gets the method used to compute a hash code
/// </summary>
public Func<T, int> GetHashCodeMethod { get; private set; }
bool IEqualityComparer<T>.Equals(T x, T y)
{
return EqualsMethod(x, y);
}
int IEqualityComparer<T>.GetHashCode(T obj)
{
if (GetHashCodeMethod == null)
return obj.GetHashCode();
return GetHashCodeMethod(obj);
}
}
Нет, для этого нет такой перегрузки метода расширения. Раньше это меня расстраивало, и поэтому я обычно пишу вспомогательный класс для решения этой проблемы. Цель состоит в том, чтобы преобразовать Func
в IEqualityComparer
.
Пример
public class EqualityFactory {
private sealed class Impl<T> : IEqualityComparer<T,T> {
private Func<T,T,bool> m_del;
private IEqualityComparer<T> m_comp;
public Impl(Func<T,T,bool> del) {
m_del = del;
m_comp = EqualityComparer<T>.Default;
}
public bool Equals(T left, T right) {
return m_del(left, right);
}
public int GetHashCode(T value) {
return m_comp.GetHashCode(value);
}
}
public static IEqualityComparer<T,T> Create<T>(Func<T,T,bool> del) {
return new Impl<T>(del);
}
}
Это позволяет вам написать следующее
var distinctValues = myCustomerList
.Distinct(EqualityFactory.Create((c1, c2) => c1.CustomerId == c2.CustomerId));
Мне кажется, вы хотите DistinctBy
от MoreLINQ . Затем вы можете написать:
var distinctValues = myCustomerList.DistinctBy(c => c.CustomerId);
Вот урезанная версия DistinctBy
(без проверки на недействительность и без возможности указать собственный компаратор ключей):
public static IEnumerable<TSource> DistinctBy<TSource, TKey>
(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> knownKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
if (knownKeys.Add(keySelector(element)))
{
yield return element;
}
}
}