2

タイトルが示すように、LINQ を使用して、指定した文字列と等しくないアイテムを DropDownList の .Items から削除することはできますか?

別の言い方をすれば、文字列のリストがあります。アイテムがリスト内のどの文字列とも一致しない場合、それは削除されます。

注: これを達成する方法はわかっています。foreach ループで実行できます。それは問題ありませんが、LINQ の代替手段があるかどうかを知りたいです。

編集:私は言う必要があります-アイテムの.Textプロパティは、文字列のリスト内の任意のアイテムと一致します。

編集:興味のある人のために、これは私が提案した「foreach」の方法でした:

        private void FilterDropDownChoices(List<String> permittedChoices)
        {
            foreach(ListItem item in ddlChoices.Items)
            {
                if (!permittedChoices.Contains(item.Text))
                {
                    ddlChoices.Items.Remove(item);
                }
            }
        }
4

3 に答える 3

9

ryanulit は実際に最良の回答を提供しました。

問題は、ListItemCollection が IEnumerable インターフェイスのみを実装していることです。LINQ 拡張機能は IEnumerable<T> で機能します。したがって、(IEnumerable) を (IEnumerable<T>) にキャストすると、LINQ を使用できるようになります。

だから、あなたの質問に答えるには:

ddlChoices.Items
.Cast<ListItem>()
.Where(item => !permittedChoices.Contains(item.Text))
.ToList()
.ForEach(ddlChoices.Items.Remove);

ToList() または ToArray() などを使用する必要があります。コレクションからの読み取り中にコレクションを変更できないためです。ToList() は、選択した項目への参照をコピーし、ループして ListItemCollection から削除できます。

これを書いているときに Matten のコメントを見ました - 彼は ListItemCollection の便利な機能 (テキスト プロパティでアイテムを削除できる) を強調しましたが、質問は間違っていました。要件は、ddlChoices.Items 内に「permittedChoices」のみを許可することでした。Matten の例では、有効な選択肢を削除し、無効な選択肢を残しています。これは、彼が求めたものとは逆です。

于 2012-07-25T14:32:06.133 に答える
2

LINQ はクエリ言語であり、データの変更には使用されません。あなたができることは、アイテムのリストに好きな条件を照会し、自分でコレクションに影響を与えることです。

サンプル:

var relevant = from item in list.Items
               where permittedChoices.Contains(item.ToString())
               select item

また、アイテム リストをクリアして、必要な関連アイテムのみを追加することもできます。

ddlChoices.Clear();
ddlChoices.AddRange(relevant.ToArray());
于 2012-07-25T14:21:48.323 に答える
1

linqを使用するだけですか?どうぞ :-)

private static void FilterDropDownChoices(List<String> permittedChoices)
{
    ddlChoices.Items.Cast<ListItem>()
       .Where(li => permittedChoices.Contains(li.Text))
       .ToList()
       .ForEach(ddlChoices.Items.Remove);
}
于 2012-07-25T14:23:16.623 に答える