尽管我仍然想知道是否可以用更少的行数来改进它,但是我有一种方法工作得很好。我已经直接在代码中记录了该方法的注释,因此我想应该清楚它的作用!
我感谢每一个建议!提前谢谢!
//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();
}
}
答案 0 :(得分:0)
多使用LINQ和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);
}
答案 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());