查找两个通用列表中相同的属性

时间:2014-07-09 18:02:26

标签: c# .net generics reflection lambda

我找不到带有lambda的oldItem(x => x.ID.Equals(newItem.ID)) - 因为它是泛型的。我可以提供另一个参数,比如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
      });
}

1 个答案:

答案 0 :(得分: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 });