c #: переключить регистр: if (case :) - PullRequest
1 голос
/ 14 июля 2011

Этот вопрос может показаться знакомым некоторым из вас, кто ответил или просмотрел мой предыдущий вопрос о перерыве;заявление.Я хочу сделать что-то, если случай 1 был удовлетворен, и что-то еще, если случай 2. Что-то вроде следующего.Может ли кто-нибудь подсказать мне (если это выполнимо), как мне добиться того, что я пытаюсь сделать, вместо того, чтобы помещать свои операторы if в корпус переключателя?

        switch (searchType)
        {
            case "SearchBooks":
                Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
                Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
                break;

            case "SearchAuthors":
                Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
                Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
                break;
        }

        int count = int(Selenium.GetXpathCount("//[@id='Results_Table']");

        if case was "SearchBooks"
        {
            //do something
        }
        else if case was "SearchAuthors"
        {
            //do something else
        }

Ответы [ 8 ]

5 голосов
/ 14 июля 2011
if (searchType == "SearchAuthors")

Вы не можете сделать лучше, чем это.

4 голосов
/ 14 июля 2011

Зови меня чудаком :)

Selenium.Type(string.Format(@"//*[@id='{0}_TextInput']", searchType), searchText);
Selenium.Click(string.Format(@"//*[@id='{0}_SearchBtn']", searchType));

И сохраните выписки по делу.

Теперь, очевидно, это работает, только если значения searchType всегда соответствуют фактическим идентификаторам элементов.

3 голосов
/ 14 июля 2011

Если в обоих случаях единственной строкой является

int count = int(Selenium.GetXpathCount("//[@id='Results_Table']");

, то я просто напишу это дважды.

int count;
switch (searchType)
{
    case "SearchBooks":
        Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
        count = int(Selenium.GetXpathCount("//[@id='Results_Table']");
        //do something
        break;

    case "SearchAuthors":
        Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
        count = int(Selenium.GetXpathCount("//[@id='Results_Table']");
        //do something else
        break;
}
2 голосов
/ 14 июля 2011

Вы можете сделать это несколькими различными способами, в зависимости от причины, по которой вы не хотите включать код в инструкцию case.У других ответчиков есть очень хорошие предложения.Мне кажется, что этот код кричит для объектно-ориентированного подхода:

var search = GetSearch(searchType);
search.PerformSearch(searchText);
int count = (int)Selenium.GetXpathCount("//[@id='Results_Table']");
search.DoSomething(count);

...

public ISearch GetSearch(string searchType)
{
    switch (searchType)
    {
        case "SearchBooks": return new SearchBooks();
        case "SearchAuthors": return new SearchAuthors();
        default: 
            throw new ArgumentException(
                string.Format("Invalid searchtype \"{0}\"", searchType), 
                "searchType");
    }
}


public interface ISearch
{
    void PerformSearch(string searchText);
    void DoSomething();
}

public class SearchBooks : ISearch
{
    public void PerformSearch(string searchText)
    {
        Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
    }

    void DoSomething()
    {
        // do something
    }
}

public class SearchAuthors : ISearch
{
    public void PerformSearch(string searchText)
    {
        Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
    }

    void DoSomething()
    {
        // do something else
    }
}
1 голос
/ 14 июля 2011

Если вы предпочитаете иметь две серии операторов switch для ясности, сначала приведите строку к перечислению, а затем продолжите.

Я могу дополнить ответ, если вы заинтересованы в этом,путь.Дайте мне знать.

public enum SearchTypeEnum{None,SearchBooks,SearchAuthors}

var searchType = (SearchTypeEnum)Enum.Parse(typeof(SearchTypeEnum), searchTypeString);

switch (searchType){    
case SearchTypeEnum.SearchBooks:
...

switch (searchType){    
case SearchTypeEnum.SearchBooks:
...
1 голос
/ 14 июля 2011
    public enum MyEnumSearchTypes
    {
        SearchBooks, SearchAuthors, SearchSomethingElse 
    }

    public void MyDoSomethingMethod(MyEnumSearchTypes searchType)
    {
        switch (searchType)
        {
            case MyEnumSearchTypes.SearchBooks:
                Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
                Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
            break;

            case MyEnumSearchTypes.SearchAuthors:
                Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
                Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
            break;
        }    

        if (searchType == MyEnumDefinedTypes.SearchBooks)
        {     
           do something
        }       

        else if (searchType == MyEnumDefinedTypes.SearchAuthors)
        {     
           do something else
        }            

        else
        {     
           do nothing
        }     
    }        

Однако я не понимаю, почему добавление функциональности в операторе switch не соответствует вашим потребностям?

1 голос
/ 14 июля 2011
    Action<int> myAction;
    switch (searchType)
        {
            case "SearchBooks":
                Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
                Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
                // assign custom action
                myAction = count => { /* the count is count */};
                break;

            case "SearchAuthors":
                Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
                Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
                // assign custom action
                myAction = count => { /* the count is count */};
                break;
           default:
              throw new NotSupportedException ();
        }

        int count = int(Selenium.GetXpathCount("//[@id='Results_Table']");
        // invoke custom action
        myAction(count);
1 голос
/ 14 июля 2011

searchType будет содержать значение того, что вам нужно.

Таким образом, вы можете получить текущую выписку по делу, а затем написать

if (searchType == "SearchBooks")
// do something
else if (searchType == "SearchAuthors")
// do something else
...