[英]Converting an array and performing a contains
我正在從數據庫表中讀取一些數據。 數據庫“ VendorList”中的一個字段返回以逗號分隔的供應商列表或僅一個ID。
例如:“ 1256,553,674”或“ 346”
我需要做幾件事:
創建新對象時,此代碼在.Select內部被調用,“供應商”是該新對象的屬性。
這是我當前正在使用的代碼:
Vendors = (m.VendorList.Contains(","))
? (from v in vendors
where m.VendorList.Split(',')
.Select(n => Convert.ToInt32(n))
.ToArray()
.Contains(v.VendorID)
select v).ToList()
: (string.IsNullOrEmpty(m.VendorList))
? null
: (from s in vendors
where s.VendorID == int.Parse(m.VendorList)
select s).ToList()
該代碼可以工作,但是看起來很凌亂,如果另一個開發人員嘗試對其進行重構,將很難維護。
我是linq的新手,您能提供一些技巧來清理這種混亂嗎?
如您所見,我正在使用兩個三元運算符。 第一個是檢測其是否以逗號分隔的列表。 第二個是檢測逗號分隔的列表是否還具有值。
嘗試這個。 我認為這等同於您要執行的操作。如果我錯了,請糾正我。
您可以在一行代碼中執行以下操作,但是我認為這種方式更具可讀性(可維護性)。
var Vendors = new List<int>();
if (m.VendorList != null)
Vendors.AddRange(vendors.Where(v => m.VendorList
.Split(',')
.Select(y => Convert.ToInt32(y))
.Contains(v))
.Select(v => v));
Vendors = from v in vendors
let vendorList = from idString in m.Split(',')
select int.Parse(idString)
where vendorList.Contains(v.VendorID)
select v;
無需檢查是否存在“,”。
您可以嘗試以下方法:
string str = "356"; //"1256,553,674";
string[] arr = str.Split(',');
List<int> lst = new List<int>();
foreach (string s in arr)
{
lst.Add(Convert.ToInt32(s));
}
列表將包含您字符串中的所有數字
string str = "1256,553,674";
IEnumerable<int> array = str.Split(',').Select(n => Convert.ToInt32(n)).ToArray();
在這種情況下,我建議您將部分內容從LINQ語句中刪除:
var vendorIds = m.VendorList
.Split(new[]{','}, StringSplitOptions.RemoveEmptyEntries)
.Select(n => Convert.ToInt32(n))
.ToArray();
someObj.Vendors = vendors.Where(v => vendorIds.Contains(v.VendorID));
vendorIds
,可以向將來的程序員指示該變量的含義。 他們不必完全掌握您的所有LINQ代碼,即可了解一般意圖。 vendors
。 此代碼對其進行一次解析,然后將數據結構重用於所有ID檢查。 (如果您有大量的供應商ID,則可以通過將vendorIds
為HashSet<>
來進一步提高性能。) 如果您輸入的內容為空字符串,則RemoveEmptyEntries
部分將確保您最終得到的供應商ID為空列表,因此沒有匹配的供應商。 如果您的輸入只有一個沒有逗號的值,那么您將在列表中得到一個ID。
請注意,這不會完全像您的原始代碼那樣工作,因為如果給定null或空m.VendorList
,它將不會將該值設置為null
。 我猜想,如果您花點時間考慮一下,擁有一個空的m.VendorList
實際上並不是您期望發生的事情,並且如果發生了,最好“快速失敗”,而不是被遺忘。想知道為什么您的.Vendors
屬性以null
。 我還猜測,如果您有一個空的 .Vendors
屬性,則使用代碼正確處理要比使用它們檢查null
值要容易得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.