0

必要な機能の 1 つとして検索を実行する必要があるプログラムを作成しています。ユーザーは、フィールドなしからすべて (合計 7) まで、任意の数のフィールドを使用できる必要があります。これまでのところ、次のように if ステートメント内でデータ入力の各ケースをグループ化することに成功しました。

List<TypeClass> myList = new List<TypeClass>

foreach TypeClass currentItem in myList

{
    if (data1 == currentItem.GetData1() || data1 == "Do Not Search" && (data2 == currentItem.GetData2() || data2 == "Do Not Search") && (data3...)

    {
        //Stuff
    }

}

お気付きかもしれませんが、各データ フィールドを角かっこで囲んでグループ化したので、入力された各データが必要な条件または「空のフィールド」のいずれかである場合にのみ、ステートメントが満たされます。ただし、ステートメントの最初の部分を他のデータのようにグループ化することはできません2,3,4...代わりに、条件を満たさない検索フィールドが他にある場合でも、ステートメントは常に true と評価されます。ステートメント。追加の括弧を使用すると、プログラムは if ステートメントを完全に無視し、ケースがまったく一致しないかのように扱います。

したがって、次のように書くと:

if ((data1 == currentIten.GetData1 || data1 == "Do Not Search") && (data2...)

何もチェックされず、ステートメントは無視されます。これは正常ですか?オプションの検索フィールドの選択を処理するためのより良い/より効率的な方法はありますか?

編集: タイプミスで申し訳ありません。各 GetDataX はアクセサーであり、括弧 () を書き忘れました。

4

3 に答える 3

2

あなたはまたは条件のためにこのようにそれをすることができます

        List<string> mylist = new List<string>();
        string data1 = "test1";
        string data2 = "test2";
        string data3 = "test3";
        string data4 = "test4";


        foreach (string s in mylist)
        {
            bool found = false;

            if(data1.Equals(s) || data1.Equals("Do not Search"))
            {
                found = true;
            }

            if (data2.Equals(s) || data1.Equals("Do not Search"))
            {
                found = true;
            }

            if (data3.Equals(s) || data1.Equals("Do not Search"))
            {
                found = true;
            }

            if (data4.Equals(s) || data1.Equals("Do not Search"))
            {
                found = true;
            }


        }

または条件のためにこのように

        List<string> mylist = new List<string>();
        string data1 = "test1";
        string data2 = "test2";
        string data3 = "test3";
        string data4 = "test4";


        foreach (string s in mylist)
        {
            bool found = false;
            bool notfound = false;

            if(data1.Equals(s) || data1.Equals("Do not Search"))
            {
                found = true;
            }
            else
            {
                notfound = true;
            }

            if (data2.Equals(s) || data1.Equals("Do not Search"))
            {
                found = true;
            }
            else
            {
                notfound = true;
            }
            if (data3.Equals(s) || data1.Equals("Do not Search"))
            {
                found = true;
            }
            else
            {
                notfound = true;
            }
            if (data4.Equals(s) || data1.Equals("Do not Search"))
            {
                found = true;
            }
            else
            {
                notfound = true;
            }

            // Force all to match
            if (notfound)
                return null;
        }

私の好みはこのようなものですが、検索機能を利用して必要なことを実行できます。

List<string> mylist = new List<string>();

        List<string> mysearches = new List<string>();

        string data1 = "test1";
        string data2 = "test2";
        string data3 = "test3";
        string data4 = "test4";

        if(data1 != "Do not Search")
            mysearches.Add(data1);
        if (data2 != "Do not Search")
            mysearches.Add(data2);
        if (data3 != "Do not Search")
            mysearches.Add(data3);
        if (data4 != "Do not Search")
            mysearches.Add(data4);
        bool found = false;
        bool andconditionmatch = true;

        foreach (string s in mylist)
        {
            if (mysearches.Contains(s))
            {
                found = true;
            }
            else
            {
                andconditionmatch = false;
            }
        }
于 2012-04-16T23:12:01.377 に答える
0

マッチングをクラス内に移動し、一致する 7 つの個別の可能な値を処理する代わりに、それらを という 1 つのクラス インスタンスにしますcriteria。以下のサンプルコードを参照してください。

public enum States
{
    None,
    Tenesee,
    Georgia,
    Colorado,
    Florida
}
class Item
{
    public States State { get; set; }
    public string Name { get; set; }
    public int ID { get; set; }

    public bool IsMatch(Item criteria)
    {
        bool match = true;
        if (criteria.State != States.None) match &= criteria.State == State;
        if (!string.IsNullOrEmpty(criteria.Name)) match &= criteria.Name.Equals(Name);
        if (criteria.ID > 0) match &= criteria.ID == ID;
        return match;
    }
    public override string ToString()
    {
        return string.Format("ID={0}, Name={1}, State={2}", ID.ToString(), Name, State.ToString());
    }
}
class Program
{

    static void Main(string[] args)
    {

        List<Item> list = new List<Item>();
        list.Add(new Item() { ID = 10016, Name = "Julia", State = States.Georgia });
        list.Add(new Item() { ID = 10017, Name = "Scott", State = States.Colorado });
        list.Add(new Item() { ID = 10018, Name = "Samantha", State = States.Tenesee });
        list.Add(new Item() { ID = 10019, Name = "Julia", State = States.Florida });


        Item criteria = new Item()
        {
            State = States.Tenesee,
            ID = 10018
        };
        List<Item> selection = list.FindAll((item) => item.IsMatch(criteria));

        foreach (var item in selection)
        {
            Console.WriteLine("{0}", item);
        }

    }
}

結果で ID=10018, Name=Samantha, State=Tenesee

そのため、条件インスタンスを構築しItem、プロパティが適切に定義されているかどうかを比較します。すべてのアイテムをループして、基準に一致するアイテムを選択します。.IsMatch()明らかに、7 つのプロパティすべてを拡張する必要があります。

于 2012-04-16T23:43:00.640 に答える
0

すべての可能性を hashset に入れます。

Hashset with all possibilities.

foreach(item in selectedItems) //you may not need this if you dont have to perform action forall selected items.
{
     if (Hashset contains item)
       //do stuff.
}
于 2012-04-16T23:19:58.073 に答える