Как я могу улучшить свой метод с меньшим количеством строк? - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть метод, который отлично работает, хотя я все еще задаюсь вопросом, можно ли его улучшить с помощью меньшего количества строк. Я задокументировал метод с комментариями непосредственно в коде, поэтому я думаю, должно быть понятно, что он делает!

Я ценю каждое предложение! Спасибо заранее!

//FULL PROPERTY FOR BINDING IN VIEW.XAML
private string _liederlisteAnzeige;
public string LiederlisteAnzeige
{
    get 
    { 
        return _liederlisteAnzeige; 
    }
    set 
    { 
        _liederlisteAnzeige = value;
        OnPropertyChanged();
    }
}

public void LiedEinfuegen()
{
    //CREATE A LIST OF CLASS LIED AND FILL WITH ACCESS-DATABASE TABLE
    Liederliste = new List<Lied>();
    Liederliste = AccessTabellen.GetAllTableData(connectionString, "SELECT * FROM " + AusgewaehlteTabelle.Tabellenname);

    //CREATE ANOTHER LIST AND FILL ONLY WITH PROPERTY LIEDERNUMMER OF LIST LIEDERLISTE BY LOOPING 
    List<string> LiederlisteLiedernamen = new List<string>();
    foreach (Lied lied in Liederliste)
    {
        if (lied.Liedernummer == AusgewaehltesLied.Liedernummer)
        {
            LiederlisteLiedernamen.Add(lied.Liedername);
        } 
    }

    //CREATE 3rd LIST TO REMOVE ALL DUPLICATES FROM LIST No2
    List<string> LiederlisteOhneDuplikate = new List<string>();
    LiederlisteOhneDuplikate = LiederlisteLiedernamen.Distinct().ToList();

    //LOOP THROUGH 3rd LIST AND CREATE A STRING (LIEDERLISTEANZEIGE) WITH STRINGBUILDER. THE STRING VARIABLE  WILL BE THEN BINDED TO VIEW.XAML CONTROL 
    StringBuilder sb = new StringBuilder();
    foreach (var item in LiederlisteOhneDuplikate)
    {
        sb.Append(item).AppendLine();
    }
    if (LiederlisteAnzeige == null)
    {
        LiederlisteAnzeige = sb.ToString();
    }
    else
    {
        LiederlisteAnzeige += sb.ToString();
    }

}

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

На самом деле это может быть немного короче, потому что вы можете использовать linq, чтобы вырезать промежуточные списки.

Обратите внимание, что ваш динамический запрос c может быть подвержен атакам sql инъекцией. Если свойство Tabellenname не скомпилировано в вашем коде, я бы не использовал это свойство в запросе выбора.

public void LiedEinfuegen()
{
    StringBuilder sb = new StringBuilder();

    // Use linq to iterate over the list with the filters inline, that way you dont't need to initialize intermediate lists.
    foreach (var item in AccessTabellen.GetAllTableData(connectionString, "SELECT * FROM " + AusgewaehlteTabelle.Tabellenname)
        .Where(l => l.Liedernummer == AusgewaehltesLied.Liedernummer)
        .Distinct())
    {
        sb.AppendLine(item);
    }

    // If you initialize LiederlisteAnzeige with an empty string "", you don't need the if null check.
    LiederlisteAnzeige += sb.ToString();
}

РЕДАКТИРОВАТЬ: Если вы объедините это с ответом Селима , вы могли бы сделайте это в одной строке, однако это немного повлияет на читаемость:

LiederlisteAnzeige += string.Join(
    Environment.NewLine, 
    AccessTabellen.GetAllTableData(connectionString, "SELECT * FROM " + AusgewaehlteTabelle.Tabellenname)
        .Where(l => l.Liedernummer == AusgewaehltesLied.Liedernummer)
        .Select(s => s.Liedername)
        .Distinct());
0 голосов
/ 09 апреля 2020

Использование LINQ more и String.Join поможет вам сделать это. Так что вам не нужно так много писать циклы foreach.

public static void LiedEinfuegen()
{
    Liederliste = AccessTabellen.GetAllTableData(connectionString, "SELECT * FROM " + AusgewaehlteTabelle.Tabellenname);

    List<string> LiederlisteOhneDuplikate = Liederliste.Where(i => i.Liedernummer == AusgewaehltesLied.Liedernummer)
                                                    .Select(s => s.Liedername).Distinct().ToList();

    var calculatedString = String.Join(Environment.NewLine, LiederlisteOhneDuplikate);

    LiederlisteAnzeige = LiederlisteAnzeige == null ? calculatedString : (LiederlisteAnzeige + calculatedString);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...