繁体   English   中英

转换数组并执行包含

[英]Converting an array and performing a contains

我正在从数据库表中读取一些数据。 数据库“ VendorList”中的一个字段返回以逗号分隔的供应商列表或仅一个ID。

例如:“ 1256,553,674”或“ 346”

我需要做几件事:

  • 将此字符串转换为int []
  • 对IEnumerable集合执行“包含”。
  • 返回该集合并将其分配给属性。

创建新对象时,此代码在.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));
  1. 这更具可读性。 通过将变量分配给vendorIds ,可以向将来的程序员指示该变量的含义。 他们不必完全掌握您的所有LINQ代码,即可了解一般意图。
  2. 这样会更好。 在你的原代码,您要重新解析整个供应商名单两次,每个价值vendors 此代码对其进行一次解析,然后将数据结构重用于所有ID检查。 (如果您有大量的供应商ID,则可以通过将vendorIdsHashSet<>来进一步提高性能。)

如果您输入的内容为空字符串,则RemoveEmptyEntries部分将确保您最终得到的供应商ID为空列表,因此没有匹配的供应商。 如果您的输入只有一个没有逗号的值,那么您将在列表中得到一个ID。

请注意,这不会完全像您的原始代码那样工作,因为如果给定null或空m.VendorList ,它将不会将该值设置为null 我猜想,如果您花点时间考虑一下,拥有一个空的m.VendorList实际上并不是您期望发生的事情,并且如果发生了,最好“快速失败”,而不是被遗忘。想知道为什么您的.Vendors属性以null 我还猜测,如果您有一个空的 .Vendors属性,则使用代码正确处理要比使用它们检查null值要容易得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM