[英]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.