Отличаться () с лямбда?

Вы могли бы интегрировать его с помощью RazorEngine, доступного из Codeplex . Это позволяет обрабатывать бритву за пределами MVC. Хотя вы не получаете все функции, которые вы получаете из версии Razor MVC, например @Html и @Url и другие.

694
задан Enigma State 30 December 2011 в 10:24
поделиться

4 ответа

Я предполагаю у вас есть IEnumerable, и в вашем примере делегата вы хотите, чтобы c1 и c2 ссылались на два элемента в этом списке?

Я считаю, что вы могли бы достичь этого с помощью самостоятельного соединения var DifferentResults = от c1 в myList присоединиться к c2 в myList на

0
ответ дан 22 November 2019 в 21:35
поделиться

Я использовал кое-что, что хорошо сработало для меня.

/// <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);
    }
}
4
ответ дан 22 November 2019 в 21:35
поделиться

Нет, для этого нет такой перегрузки метода расширения. Раньше это меня расстраивало, и поэтому я обычно пишу вспомогательный класс для решения этой проблемы. Цель состоит в том, чтобы преобразовать 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));
19
ответ дан 22 November 2019 в 21:35
поделиться

Мне кажется, вы хотите 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;
        }
    }
}
478
ответ дан 22 November 2019 в 21:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: