Skip to main content
added note on performance impact
Source Link
ANeves
  • 2.9k
  • 17
  • 29

Well, you could receive a delegate for getting the elements - that is, to make the action that is different:

public List<Item> GetItems(Func<Item, Repository> getOtherItems) {
  if( getOtherItems == null ) {
    throw new ArgumentException();
  }
  var result = new List<Item>();
  foreach(var item in repo.GetItems2()) {
    var x = getOtherItems();
    if (x.Value > 5)
      result.Add(x);
  }  

  return result;
}

And then you could call it like so:

// In class A
this.GetItems( repo => repo.GetOtherItems1(item.Id, "param1", param2) );

// In class B
this.GetItems( repo => repo.GetOtherItems2(param1, param2, item.Id) );

But I notice that you also use repo.GetItems1() in A and repo.GetItems2() in B.
So the difference you pointed out is not the only one.

With this in mind, I would advise rethinking your class structure. These two could inherit from the same base class, and merely extend it. (Or it could be polymorphism, or...)

Maybe:

public interface IMyList<Item>
{
    List<int> GetItems();
    // If it returns a single item, the name should NOT be pluralized!!
    Item GetOtherItems();
}

Or maybe an abstract class?


edit: read @JoeGeeky 's comment on the performance impact of using delegates; this may become relevant if the delegate is used on a very intensive cycle or under high loads.

Well, you could receive a delegate for getting the elements - that is, to make the action that is different:

public List<Item> GetItems(Func<Item, Repository> getOtherItems) {
  if( getOtherItems == null ) {
    throw new ArgumentException();
  }
  var result = new List<Item>();
  foreach(var item in repo.GetItems2()) {
    var x = getOtherItems();
    if (x.Value > 5)
      result.Add(x);
  }  

  return result;
}

And then you could call it like so:

// In class A
this.GetItems( repo => repo.GetOtherItems1(item.Id, "param1", param2) );

// In class B
this.GetItems( repo => repo.GetOtherItems2(param1, param2, item.Id) );

But I notice that you also use repo.GetItems1() in A and repo.GetItems2() in B.
So the difference you pointed out is not the only one.

With this in mind, I would advise rethinking your class structure. These two could inherit from the same base class, and merely extend it. (Or it could be polymorphism, or...)

Maybe:

public interface IMyList<Item>
{
    List<int> GetItems();
    // If it returns a single item, the name should NOT be pluralized!!
    Item GetOtherItems();
}

Or maybe an abstract class?

Well, you could receive a delegate for getting the elements - that is, to make the action that is different:

public List<Item> GetItems(Func<Item, Repository> getOtherItems) {
  if( getOtherItems == null ) {
    throw new ArgumentException();
  }
  var result = new List<Item>();
  foreach(var item in repo.GetItems2()) {
    var x = getOtherItems();
    if (x.Value > 5)
      result.Add(x);
  }  

  return result;
}

And then you could call it like so:

// In class A
this.GetItems( repo => repo.GetOtherItems1(item.Id, "param1", param2) );

// In class B
this.GetItems( repo => repo.GetOtherItems2(param1, param2, item.Id) );

But I notice that you also use repo.GetItems1() in A and repo.GetItems2() in B.
So the difference you pointed out is not the only one.

With this in mind, I would advise rethinking your class structure. These two could inherit from the same base class, and merely extend it. (Or it could be polymorphism, or...)

Maybe:

public interface IMyList<Item>
{
    List<int> GetItems();
    // If it returns a single item, the name should NOT be pluralized!!
    Item GetOtherItems();
}

Or maybe an abstract class?


edit: read @JoeGeeky 's comment on the performance impact of using delegates; this may become relevant if the delegate is used on a very intensive cycle or under high loads.

Source Link
ANeves
  • 2.9k
  • 17
  • 29

Well, you could receive a delegate for getting the elements - that is, to make the action that is different:

public List<Item> GetItems(Func<Item, Repository> getOtherItems) {
  if( getOtherItems == null ) {
    throw new ArgumentException();
  }
  var result = new List<Item>();
  foreach(var item in repo.GetItems2()) {
    var x = getOtherItems();
    if (x.Value > 5)
      result.Add(x);
  }  

  return result;
}

And then you could call it like so:

// In class A
this.GetItems( repo => repo.GetOtherItems1(item.Id, "param1", param2) );

// In class B
this.GetItems( repo => repo.GetOtherItems2(param1, param2, item.Id) );

But I notice that you also use repo.GetItems1() in A and repo.GetItems2() in B.
So the difference you pointed out is not the only one.

With this in mind, I would advise rethinking your class structure. These two could inherit from the same base class, and merely extend it. (Or it could be polymorphism, or...)

Maybe:

public interface IMyList<Item>
{
    List<int> GetItems();
    // If it returns a single item, the name should NOT be pluralized!!
    Item GetOtherItems();
}

Or maybe an abstract class?