2

文字列のリストがあります。Google クエリと同様の方法でそれらをフィルタリングできる必要があります。

元:NOT water OR (ice AND "fruit juice")

水という単語を含まない文字列を返すこと、または氷と「フルーツ ジュース」があれば水を含む文字列を返すことを意味します。

ユーザーがこのフォーム(テキストボックスなど)でクエリを記述し、文字列のリストまたはIEnumerableを指定して、これを含むものを返すことができる.NETのメカニズムはありますか。

LINQはおそらくこのようなことをすることができますか?

私はLINQでこれを行うことができることを認識しています.私は、任意の文字列を実行可能な式に解析することにもっと関心があります.

4

5 に答える 5

3

何も組み込まれていません。

そのような文字列を自分で解析し、場合によってはExpressionクラスを使用して、フィルタリングする実行可能な式を作成する必要があります。

于 2013-04-05T12:34:27.580 に答える
1

このクエリの場合:水という単語を含まない文字列を返すこと、または氷と「フルーツ ジュース」がある場合に水を含む文字列を返すことを意味します。

使用する場合は、このようなものを試してくださいLINQ

 yourList.Where(i => !i.Contains("water") || 
                (i.Contains("water") && 
                 i.Contains("ice") && 
                 i.Contains("fruit juice")));
于 2013-04-05T12:34:30.723 に答える
0

あなたが言ったように、これはより論理的であるため、コードサンプルを使用して答えることはできないと思います。

このようなシナリオで私が行うことは、次のような「コーディング翻訳」とともに必要なすべての条件を含む定義済みの条件 (どこかに保存) を用意することです。

  • また
  • ではない
  • または
  • 等...

実行時に行うことは、これらの条件/基準を sql や linq、またはそれを渡す必要のある言語に変換することです。

于 2013-04-05T12:38:45.627 に答える
0

DataTable.Select次の方法を試すことができます。

public static class ExpressionExtensions {

  public static IEnumerable<T> Select<T>(this IEnumerable<T> self, string expression) {
    var table = new DataTable();
    table.Columns.Add("Value", typeof(T));

    foreach (var item in self) {
      var row = table.NewRow();
      row["Value"] = item;
      table.Rows.Add(item);
    }

    return table.Select(expression).Select(row => (T)row["Value"]);
  }

}

ただし、式を作成するには、その形式に従う必要があります。

var filtered = strings.Select("NOT Value LIKE '*water*' OR (Value LIKE '*ice*' AND Value LIKE '*fruit juice*')");

また、この場合、文字列にfruit juiceは既に string が含まれているためice、2 番目の条件は冗長であることに注意してください。「部分文字列」ではなく「単語」を表現する方法を見つける必要があります。

最終的には、解析ロジックを自分で実装したほうがよいかもしれません。

于 2013-04-06T22:51:00.233 に答える
0

LINQ では:list.Where(item => !item.Contains("water") || (item.Contains("ice") && item.Contains("fruit juice")))

于 2013-04-05T12:35:23.403 に答える