【问题标题】:Find properties that are equal in two generic lists在两个通用列表中查找相等的属性
【发布时间】:2014-07-09 18:02:25
【问题描述】:

我找不到带有 lambda (x => x.ID.Equals(newItem.ID)) 的 oldItem - 因为它是泛型的。我可以提供另一个参数,如 ID 并使用它来获取属性的值(通过反射) - 但这真的是要走的路还是有更好的方法?

private void LogDiff<T>(HashSet<T> newList, HashSet<T> oldList)
{
   Parallel.ForEach(newList, newItem =>
   {
      var oldItem = oldList.FirstOrDefault(x => x.ID.Equals(newItem.ID));
      if (oldItem!= null)
      {
          //Yay i found my item
      });
}

【问题讨论】:

    标签: c# .net generics reflection lambda


    【解决方案1】:

    不,您通常会通过另一个参数提供 ID 投影:

    // Parameters renamed as they're not lists...
    private void LogDiff<T, TKey>(HashSet<T> newItems, HashSet<T> oldItems,
                                  Func<T, TKey> keySelector)
    {
        var comparer = EqualityComparer<TKey>.Default;
        Parallel.ForEach(newItems, newItem =>
        {
            var newKey = keySelector(newItem);
            var oldItem = oldList.FirstOrDefault(x => comparer.Equals(newKey, keySelector(x));
            if (oldItem != null)
            {
                // Use the item
            }
        });
    }
    

    但是,与仅使用 Join 相比,这相当低效 - 仍然可以并行执行:

    var query = newItems.AsParallel()
                        .Join(oldItems.AsParallel(), keySelector, keySelector,
                              (n, o) => new { NewItem = n, OldItem = o });
    

    【讨论】:

    • 这听起来像是在很酷的解决方案@Jon Skeet - 我在这方面并不强,你能告诉我这个方法是如何被调用的,例如你是如何从我的 T 对象中定义带有 ex ID 的 Func 的吗?
    • @MacGyver:调用者会指定它,例如LogDiff(newItems, oldItems, x =&gt; x.ID)
    • 我无法让它工作 - 它说无效的参数,你知道我做错了什么吗?
    • 我的错,我明白了。感谢@Jon Skeet 的帮助 - 你就是男人!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 2016-05-27
    相关资源
    最近更新 更多