首先,你可以簡化,如果條件:
public List<PriceRow> GetABSPriceRows(string dekorNr, string bezeichnung, string hersteller)
{
List<PriceRow> lstFoundPriceRows = _lstABSPriceRows; //_lstABSPriceRows is the source list
if (!string.IsNullOrWhitespace(dekorNr))
lstFoundPriceRows = lstFoundPriceRows.FindAll(p => p.Artikelnummer.Contains(dekorNr));
if (!string.IsNullOrWhitespace(bezeichnung))
lstFoundPriceRows = lstFoundPriceRows.FindAll(p => p.Bezeichnung.Contains(bezeichnung));
if (!string.IsNullOrWhitespace(hersteller))
lstFoundPriceRows = lstFoundPriceRows.FindAll(p => p.Lieferant.Contains(hersteller));
return lstFoundPriceRows;
}
其次,你可以使用它實際上並不在列表上進行掃描where子句(你是預成型3個掃描現在):
public List<PriceRow> GetABSPriceRows(string dekorNr, string bezeichnung, string hersteller)
{
IEnumerable<PriceRow> lstFoundPriceRows = _lstABSPriceRows; //_lstABSPriceRows is the source list
if (!string.IsNullOrWhitespace(dekorNr))
lstFoundPriceRows = lstFoundPriceRows.Where(p => p.Artikelnummer.Contains(dekorNr));
if (!string.IsNullOrWhitespace(bezeichnung))
lstFoundPriceRows = lstFoundPriceRows.Where(p => p.Bezeichnung.Contains(bezeichnung));
if (!string.IsNullOrWhitespace(hersteller))
lstFoundPriceRows = lstFoundPriceRows.Where(p => p.Lieferant.Contains(hersteller));
return lstFoundPriceRows.ToList();
}
既然你現在正在做一個掃描反正你可以移動在Where
謂詞的條件:
public List<PriceRow> GetABSPriceRows(string dekorNr, string bezeichnung, string hersteller)
{
IEnumerable<PriceRow> lstFoundPriceRows = _lstABSPriceRows; //_lstABSPriceRows is the source list
lstFoundPriceRows = lstFoundPriceRows.Where(p => string.IsNullOrWhitespace(dekorNr) || p.Artikelnummer.Contains(dekorNr));
lstFoundPriceRows = lstFoundPriceRows.Where(p => string.IsNullOrWhitespace(bezeichnung) || p.Bezeichnung.Contains(bezeichnung));
lstFoundPriceRows = lstFoundPriceRows.Where(p => string.IsNullOrWhitespace(hersteller) || p.Lieferant.Contains(hersteller));
return lstFoundPriceRows.ToList();
}
由於您沒有更多的ifs,您可以將這些語句合併爲一個。
public List<PriceRow> GetABSPriceRows(string dekorNr, string bezeichnung, string hersteller)
{
return _lstABSPriceRows
.Where(p => string.IsNullOrWhitespace(dekorNr) || p.Artikelnummer.Contains(dekorNr))
.Where(p => string.IsNullOrWhitespace(bezeichnung) || p.Bezeichnung.Contains(bezeichnung))
.Where(p => string.IsNullOrWhitespace(hersteller) || p.Lieferant.Contains(hersteller))
.ToList();
}
最後,我們可以組所有的Where
謂詞到一個(感謝@Kris):
public List<PriceRow> GetABSPriceRows(string dekorNr, string bezeichnung, string hersteller)
{
return _lstABSPriceRows
.Where(p => (string.IsNullOrWhitespace(dekorNr) || p.Artikelnummer.Contains(dekorNr)) &&
(string.IsNullOrWhitespace(bezeichnung) || p.Bezeichnung.Contains(bezeichnung)) &&
(string.IsNullOrWhitespace(hersteller) || p.Lieferant.Contains(hersteller)))
.ToList();
}
您可以通過使用像這樣的擴展方法創建的IsNullOrWhitespace
一個簡單(3.5兼容):
public static bool IsNullOrWhitespace(this string s)
{
return (s == null || string.IsNullOrEmpty(s.Trim()));
}
而且它表達變得更簡單:
public List<PriceRow> GetABSPriceRows(string dekorNr, string bezeichnung, string hersteller)
{
return _lstABSPriceRows
.Where(p => (dekorNr.IsNullOrWhitespace() || p.Artikelnummer.Contains(dekorNr)) &&
(bezeichnung.IsNullOrWhitespace() || p.Bezeichnung.Contains(bezeichnung)) &&
(hersteller.IsNullOrWhitespace() || p.Lieferant.Contains(hersteller)))
.ToList();
}
好了,你可以替換'((X!= NULL)&&!x.Trim()。等於(的String.Empty))'和'!string.IsNullOrWhitespace(X)'的一個開始。 – Rawling
那麼你可以創建一個方法來構建一個'Func'。但首先要做的就是使用'string.IsNullOrWhiteSpace' –
@ user1567896如果沒有參數爲空,該怎麼辦? –