如何减少行数来改善方法?

时间:2020-04-09 19:28:07

标签: c# wpf mvvm

尽管我仍然想知道是否可以用更少的行数来改进它,但是我有一种方法工作得很好。我已经直接在代码中记录了该方法的注释,因此我想应该清楚它的作用!

我感谢每一个建议!提前谢谢!

//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 :(得分:0)

多使用LINQString.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);
}

答案 1 :(得分:0)

实际上它可能要短一些,因为您可以使用linq剪切出中间列表。

请注意,您的动态查询可能易于受到sql注入攻击。除非在您的代码中编译了Tabellenname属性,否则我不会在select查询中使用该属性。

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();
}

编辑: 如果将其与Selim的answer结合使用,则可以在一行中完成此操作,但是,这会稍微影响可读性:

LiederlisteAnzeige += string.Join(
    Environment.NewLine, 
    AccessTabellen.GetAllTableData(connectionString, "SELECT * FROM " + AusgewaehlteTabelle.Tabellenname)
        .Where(l => l.Liedernummer == AusgewaehltesLied.Liedernummer)
        .Select(s => s.Liedername)
        .Distinct());
相关问题