C# 如何用更少的行数改进我的方法?
我有一个很好的方法,尽管我仍然在想,是否可以用更少的线来改进它。我已经在代码中直接用注释记录了这个方法,所以我想应该很清楚它是做什么的 我感谢你的每一个建议!提前谢谢C# 如何用更少的行数改进我的方法?,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个很好的方法,尽管我仍然在想,是否可以用更少的线来改进它。我已经在代码中直接用注释记录了这个方法,所以我想应该很清楚它是做什么的 我感谢你的每一个建议!提前谢谢 //FULL PROPERTY FOR BINDING IN VIEW.XAML private string _liederlisteAnzeige; public string LiederlisteAnzeige { get { return _liederlisteAnzeige;
//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();
}
}
//VIEW.XAML中绑定的完整属性
私有字符串(liederlistenzeige);
公共字符串LiederListenzeige
{
得到
{
返回(liederlistenzeige);;
}
设置
{
_LiederListenzeige=值;
OnPropertyChanged();
}
}
公共无效LiedEinfuegen()
{
//创建类列表并填充ACCESS-DATABASE表
Liederliste=新列表();
Liederliste=AccessTabellen.GetAllTableData(connectionString,“选择*自”+AusgawehlteTabelle.Tabellenname);
//创建另一个列表并通过循环仅使用列表LIEDERLISTE的属性LIEDERNUMMER填充
List LIDERLISTELEDERNAMEN=新列表();
foreach(谎称Liederliste)
{
如果(lied.Liedernummer==Ausgawehlteslied.Liedernummer)
{
添加(lied.Liedername);
}
}
//创建第三个列表以删除列表2中的所有重复项
List LIEDERLISTEOHNEDULPKATE=新列表();
LiederListeOhneduplekate=LiederlisteLiedernamen.Distinct().ToList();
//循环浏览第三个列表并使用STRINGBUILDER创建一个字符串(LiederListenzeige)。然后该字符串变量将绑定到VIEW.XAML控件
StringBuilder sb=新的StringBuilder();
foreach(LiederListedOhuplicate中的var项目)
{
sb.Append(item.AppendLine();
}
if(liederListenzeige==null)
{
LiederListenzeige=sb.ToString();
}
其他的
{
LiederListenzeige+=sb.ToString();
}
}
使用“更多”并帮助您做到这一点。这样就不需要编写太多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);
}
public static void LiedEinfuegen()
{
Liederliste=AccessTabellen.GetAllTableData(connectionString,“选择*自”+AusgawehlteTabelle.Tabellenname);
列出LiederListeOhneduplekate=Liederliste.Where(i=>i.Liedernummer==Ausgawehlted.Liedernummer)
.Select(s=>s.Liedername).Distinct().ToList();
var calculatedString=String.Join(Environment.NewLine,liederlistohneduplekate);
LiederListenzeige=LiederListenzeige==null?calculatedString:(LiederListenzeige+calculatedString);
}
实际上可以稍微短一点,因为可以使用linq删除中间列表
请注意,动态查询可能容易受到sql注入攻击。除非在代码中编译了选项卡lenname
属性,否则我不会在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的结合起来,你可以在一行中完成这件事,但是,它会稍微影响可读性:
LiederlisteAnzeige += string.Join(
Environment.NewLine,
AccessTabellen.GetAllTableData(connectionString, "SELECT * FROM " + AusgewaehlteTabelle.Tabellenname)
.Where(l => l.Liedernummer == AusgewaehltesLied.Liedernummer)
.Select(s => s.Liedername)
.Distinct());
减少某些行的最快方法是不要将列表初始化为空列表,然后再次分配它们。您可以安全地删除行
Liederliste=newlist()例如,代码>。这就是说,少行并不总是最好的——有时,多行代码会使代码更易于阅读和维护。请参阅软件工程堆栈交换站点。谢谢!这将是我的下一个问题:你能给我一个‘更多行==更容易阅读和维护’的例子吗:-)<代码>someobject.doSomething(someSingleton.getInstance().with().a().lot().of().law().of().demeter().violations())和().if().that().werent().Though().theres().more()代码>从第二个答案中窃取。这只是一个(荒谬的)例子,但它强调了分隔成更多行如何使事情更可读、更易于调试等。如果您在web上搜索代码可读性和维护这一主题,我想您会找到很多资源。嗨,Jesse,谢谢您的linq声明。不知道已经可以将其包含到foreach循环中。太棒了!您假设还需要设置Liederliste属性。为什么要这样做?作为view.xaml中的绑定属性,我猜?!“在这种情况下,它是不需要的……”罗伯特更新了我的答案。如果不需要Liederliste
属性,可以将其全部放在一条语句中。这行代码看起来很棒,但它不是每次循环都访问数据库吗?我认为这会降低性能,不是吗?不,该查询只执行一次。嗨,Selim,我非常喜欢你的代码->少打字。在这方面我很懒。谢谢!不客气。如果它对您有帮助,请将答案标记为已接受,以便帮助其他人。