繁体   English   中英

如何用更少的行改进我的方法?

[英]How can I improve my method with less lines?

我有一个效果很好的方法,但我仍然想知道是否可以用更少的行来改进它。 我已经直接在代码中记录了带有注释的方法,所以我想应该清楚它的作用!

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

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

}

更多地使用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);
}

实际上它可以短一点,因为你可以使用 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();
}

编辑:如果你把它和塞利姆的回答结合起来,你可以在一行中做这件事,但是,它会影响可读性:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM