2

重複の可能性:
LINQステートメントで動的に実行されるメソッドにwhereステートメントを送信するにはどうすればよいですか?

単純なLINQクエリを別々のメソッドで記述してきましたが、繰り返しになっています。名前と場所のばかげた例を許してください。3つのメソッドすべてで変更されるのは「where」句だけです。

この反復的なコードをどのようにしてより乾燥させることができますか?

たとえば、すべてを同じに取るが、where句を変更できるヘルパーメソッドのようなものです。

public IEnumerable<NamePlace> GetSomeData(int num1, int num2)
{
  var temp = from Name in Names
             from Place in Places
             where Name.id == num1 && Place.id = num2
             select new NamePlace {
                  field1 = Name.name;
                  field2 = Place.name;
             };
  return temp;
}

public IEnumerable<NamePlace> GetSomeData2(int num1, int num2)
{
  var temp = from Name in Names
             from Place in Places
             where Name.age == num1 && Place.streetNumber = num2
             select new NamePlace {
                  field1 = Name.name;
                  field2 = Place.name;
             };
  return temp;
}

public IEnumerable<NamePlace> GetSomeData3(int num1, int num2)
{
  var temp = from Name in Names
             from Place in Places
             where Name.favouriteNumber == num1 && Place.neighbourNumber = num2
             select new NamePlace {
                  field1 = Name.name;
                  field2 = Place.name;
             };
  return temp;
}
4

3 に答える 3

4

必要なのは、タイプのパラメータですFunc<T1, T2, bool>。ここで、T1およびT2はそれぞれのアイテムのタイプです。NamesPlaces

private IEnumerable<NamePlace> GetSomeDataHelper(Func<Name, Place, bool> filter)
{
  var query = from name in Names
             from place in Places
             where filter(name, place)
             select new NamePlace {
                  field1 = name.name,
                  field2 = place.name,
             };
  return query;
}

public IEnumerable<NamePlace> GetSomeData1(int num1, int num2)
{
    return GetSomeDataHelper((name, place) => name.id == num1 && place.id = num2);
}
于 2013-01-30T18:18:25.687 に答える
0

メソッドにaを渡しFunc<Name, Place,bool>、Where句で評価します。

public IEnumerable<NamePlace> GetSomeData(Func<Name,Place, bool> condition)
{
  var temp = from Name in Names
             from Place in Places
             where condition(Name,Place)
             select new NamePlace {
                  field1 = Name.name;
                  field2 = Place.name;
             };
  return temp;
}

次に、次のような関数を呼び出します。

GetSomeData((name,place)=>name.FavNumber=5 && Place.Neighbor==7);
于 2013-01-30T18:17:00.077 に答える
0

GetSomeData()が述語を受け入れるようにすることができます。

public IEnumerable<NamePlace> GetSomeData(int num1, int num2, Func<Name, Place, bool> predicate)
{
    var temp = from Name in Names
         from Place in Places
         where predicate(Name, Place)
         select new NamePlace {
              field1 = Name.name;
              field2 = Place.name;
         };
   return temp;
}

そして、あなたはそれをこのように呼ぶことができます:

var results = GetSomeData(num1, num2, (name, place) => name.id == num1 && place.id = num2);
于 2013-01-30T18:17:13.057 に答える