我正在做一個專案,將各種檔案上傳到平臺。該平臺有超過 100DocumentTypeId秒。這些檔案沒有固定的命名約定。因此,為了確定檔案的檔案,DoumentTypeId我目前正在使用回傳字串的方法執行此操作
if (fileName.Contains("401k") || fileName.Contains("401(k)") || fileName.Contains("457b") || fileName.Contains("457(b)") || fileName.Contains("retire"))
{
return "401k-and-retirement";
}
else if (fileName.Contains("aflac"))
{
return "aflac";
}
else if ( fileName.Contains("beneficiary form") || fileName.Contains("beneficiaries") || fileName.Contains("beneficiary")
)
{
return "beneficiary-forms";
}
else if (fileName.Contains("benefit enrollment") || fileName.Contains("benefits enrollment") || fileName.Contains("benefit form") || fileName.Contains("benefits form") || fileName.Contains("benefit paperwork") || fileName.Contains("qualifying event") || fileName.Contains("enrollment") || fileName.Contains("b enroll") || fileName.Contains("benefit enrollnent")) //yes, the typo is on purpose. there are typos in some of the file names to import
{
return "benefits-election";
}
//etc
可以想象,這種方法非常丑陋且冗長(約 300 行)。我想重構它并利用資料庫。我想有兩個欄位的表中DocumentTypeId,并FileNameContains在那里FileNameContains是一個逗號分隔的串列OR情況下字串。這將允許在不進行任何代碼更改的情況下添加任何案例。
我不確定的是如何對string.Contains()資料庫進行比較。我知道,LIKE但這與string.Contains(). 我還考慮過查詢資料庫以將FileNameContains每個記錄的欄位轉換為陣列或串列,并執行一個擴展方法(類似這樣),回圈遍歷并執行string.Contains(). 但這似乎不是很有效和快速。
我接近這個錯誤嗎?我只知道必須有比一堆else if帶有OR案例的陳述更好的方法。而且我真的認為擁有一個資料庫會使這更優雅和可擴展,而無需任何代碼更改和純 SQLUPDATE陳述句。一些幫助和投入將不勝感激。
uj5u.com熱心網友回復:
我會使用字典或鍵值對串列.. 鍵是“找到這個”,值是“檔案型別”
var d = new Dictionary<string, string>{
{ "401k", "401k-and-retirement" },
{ "401(k)", "401k-and-retirement" },
{ "457b", "401k-and-retirement" },
{ "457(b)", "401k-and-retirement" },
{ "retire", "401k-and-retirement" },
{ "aflacs", "aflacs" },
...
};
foreach(var kvp in d)
if(filename.Contains(kvp.Key)) return kvp.Value;
向您的串列/字典中添加更多條目,甚至從資料庫中填充它
我不確定的是如何對資料庫進行 string.Contains() 比較
好吧,您可以將這個相同的概念傳輸到資料庫中,并將您的值像這樣存盤在您的表中:
Find, Ret
@1k%, 401k-and-retirement
@1(k)%, 401k-and-retirement
并查詢如下:
SELECT ret FROM table WHERE @pFilename LIKE Find
使用 ac# 側引數
//adjust type and size to match your column
command.Parameters.Add("@pFilename", SqlDbType.VarChar, 50).Value = "my401k.txt";
或者您將在 Dapper、EF 等中使用的任何等效項。
context.FindRets.FirstOrDefault(fr => EF.Functions.Like(filename, fr.Find))
為了相關神的愛,請不要在表格列中存盤CSV。它遲早會咬你
uj5u.com熱心網友回復:
我通常會做這樣的事情:
var contains = new []
{
new
{
find = new [] { "401k", "401(k)", "457b", "457(b)", "retire" },
result = "401k-and-retirement"
},
new { find = new [] { "aflac" }, result = "aflac" },
new
{
find = new [] { "beneficiary form", "beneficiaries", "beneficiary" },
result = "beneficiary-forms"
},
new
{
find = new []
{
"benefit enrollment", "benefits enrollment", "benefit form", "benefits form", "benefit paperwork",
"qualifying event", "enrollment", "b enroll", "benefit enrollnent"
},
result = "benefits-election"
},
};
return
contains
.Where(x => x.find.Any(f => fileName.Contains(f)))
.Select(x => x.result)
.FirstOrDefault();
優點是可以更輕松地添加和維護您要查找的專案。這一切都在螢屏的一部分上。
您可以更進一步,將其保存在一個文本檔案中,如下所示:
401k-and-retirement
401k
401(k)
457b
457(b)
retire
aflac
aflac
beneficiary-forms
beneficiary form
beneficiaries
beneficiary
benefits-election
benefit enrollment
benefits enrollment
benefit form
benefits form
benefit paperwork
qualifying event
enrollment
b enroll
benefit enrollnent
然后你可以這樣做:
var contains =
File
.ReadLines("config.txt")
.Aggregate(
new[] { new { find = new List<string>(), result = "" } }.ToList(),
(a, x) =>
{
if (x.StartsWith(' '))
{
a.Last().find.Add(x.Substring(1));
}
else
{
a.Add(new { find = new List<string>(), result = x });
}
return a;
}, a => a.Skip(1).ToArray());
contains.Dump();
return
contains
.Where(x => x.find.Any(f => fileName.Contains(f)))
.Select(x => x.result)
.FirstOrDefault();
現在您可以根據需要向組態檔添加更多專案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/399924.html
標籤:C# sql-server 数据库
