簡體   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