16

プレースホルダー内のすべてのテキスト ボックスを選択し、構造体を使用してリストに追加する linq クエリがあります。この機能を拡張して、DropDownList の selectedvalue も取得する必要があります。メソッドをデバッグすると、リストのカウントが 0 になるため、これが間違っていると確信しています。

私自身の推測では、2 を宣言するのOfType<>()は間違っていると思いますが、私は linq を初めて使用するので、他に方法がわかりません。

どんな助けでも素晴らしいでしょう!前もって感謝します。

これが私がこれまでに持っているものです:

public struct content
{
    public string name;
    public string memberNo;
    public int points;
    public string carclass;
}

List<content> rows = new List<content>();

protected void LinkButton_Submit_Attendees_Click(object sender, EventArgs e)
{
List<content> rows = PlaceHolder_ForEntries.Controls.OfType<TextBox>().OfType<DropDownList>()
        .Select(txt => new
        {
            Txt = txt,
            Number = new String(txt.ID.SkipWhile(c => !Char.IsDigit(c)).ToArray())
        })
        .GroupBy(x => x.Number)
        .Select(g => new content
        {
            carclass = g.First(x => x.Txt.ID.StartsWith("DropDownlist_CarClass")).Txt.SelectedValue,
            name = g.First(x => x.Txt.ID.StartsWith("TextBox_Name")).Txt.Text,
            memberNo = g.First(x => x.Txt.ID.StartsWith("TextBox_MemberNo")).Txt.Text,
            points = int.Parse(g.First(x => x.Txt.ID.StartsWith("TextBox_Points")).Txt.Text)
        })
        .ToList();
}

コントロールを作成するメソッドを次に示します。

protected void createcontrols()
{
    int count = 0;
    if (ViewState["count"] != null)
    {
        count = (int)ViewState["count"];
    }
    while (PlaceHolder_ForEntries.Controls.Count < count)
    {
        TextBox TextBox_Name = new TextBox();
        TextBox TextBox_MemberNo = new TextBox();
        TextBox TextBox_Points = new TextBox();
        DropDownList DropDownList_CarClass = new DropDownList();
        DropDownList_CarClass.Items.Add("Car1");
        ...
        DropDownList_CarClass.Items.Add("Car2");
        TextBox_Name.Attributes.Add("placeholder", "Navn");
        TextBox_Name.ID = "TextBox_Name" + PlaceHolder_ForEntries.Controls.Count.ToString();
        TextBox_Name.CssClass = "input-small";
        TextBox_MemberNo.Attributes.Add("placeholder", "Medlemsnr.");
        TextBox_MemberNo.ID = "TextBox_MemberNo" + PlaceHolder_ForEntries.Controls.Count.ToString();
        TextBox_MemberNo.CssClass = "input-small";
        TextBox_Points.Attributes.Add("placeholder", "Point");
        TextBox_Points.ID = "TextBox_Points" + PlaceHolder_ForEntries.Controls.Count.ToString();
        TextBox_Points.CssClass = "input-small";
        PlaceHolder_ForEntries.Controls.Add(TextBox_Name);
        PlaceHolder_ForEntries.Controls.Add(TextBox_MemberNo);
        PlaceHolder_ForEntries.Controls.Add(DropDownList_CarClass);
        PlaceHolder_ForEntries.Controls.Add(TextBox_Points);
        PlaceHolder_ForEntries.Controls.Add(new LiteralControl("<br />"));
    }
}
4

5 に答える 5

21

を使用して、タイプWhereのオブジェクトのインスタンスかどうかを確認できますis!

List<content> rows = PlaceHolder_ForEntries.Controls.Cast<Control>().Where(c => c is TextBox || c is DropDownList)
        .Select(txt => new
        {
            Txt = txt,
            Number = new String(txt.ID.SkipWhile(c => !Char.IsDigit(c)).ToArray())
        })
        .GroupBy(x => x.Number)
        .Select(g => new content
        {
            carclass = g.First(x => x.Txt.ID.StartsWith("DropDownlist_CarClass")).Txt.SelectedValue,
            name = g.First(x => x.Txt.ID.StartsWith("TextBox_Name")).Txt.Text,
            memberNo = g.First(x => x.Txt.ID.StartsWith("TextBox_MemberNo")).Txt.Text,
            points = int.Parse(g.First(x => x.Txt.ID.StartsWith("TextBox_Points")).Txt.Text)
        })
        .ToList();
于 2013-03-16T17:13:05.873 に答える
11

AppDeveloper は正しいです。OfType<T>以外のタイプのすべてのオブジェクトを除外しますT。そのため、2 回フィルタリングすることで、リスト内のすべてのオブジェクトを効果的に排除できます。

このロジック (リストから2 つを除くすべての型をフィルター処理する) を再利用可能なものにラップしたい場合、独自の拡張メソッドを実装することを妨げるものは何もありません。

using System.Collections;

public static class EnumerableExtensions
{
    public static IEnumerable OfType<T1, T2>(this IEnumerable source)
    {
        foreach (object item in source)
        {
            if (item is T1 || item is T2)
            {
                yield return item;
            }
        }
    }
}

上記のクラスをプロジェクトに含めると、アプリケーションで次のようなコードを記述できます。

var textBoxesAndDropDowns = controls.OfType<TextBox, DropDownList>();

拡張メソッドの詳細については、件名に関する MSDN の記事を参照してください。

上記の拡張メソッドは 2 つの異なる型を「受け入れる」ため、結果は依然として非ジェネリックIEnumerableシーケンスであることに注意してください。結果を一般的なシーケンス (たとえば、 ) として扱いたい場合は、拡張メソッドIEnumerable<Control>を使用することをお勧めします。Cast<T>

var filteredControls = controls.OfType<TextBox, DropDownList>().Cast<Control>();
于 2013-03-16T17:27:17.560 に答える
3

質問を完全に読んだことはありませんが、タイトルが意味することから、次の方法で動作を実現できます。

var collection = new object[] { 5, "4545",  'd', 54.5 , 576 };

var allowedTypes = new[] { typeof(string), typeof(int) }; 
var result = collection
 .Where(item => allowedTypes.Contains(item.GetType()));

実際の動作はこちらでご覧ください。

于 2017-02-19T05:29:48.557 に答える
-1

あなたの問題は、OfType<>().OfType<>()異なるタイプで2回フィルタリングすることです

于 2013-03-16T17:14:47.633 に答える