As mentioned in the comments, this happens because you are modifying the collection which you are looping through as you're performing your work.
One option you have is to create a temporary collection and add your sku items to that, and finally add the contents of the temporary List<sku> to your CompanyDbContext
// Create a new temporary list
List<sku> tempSkus = new List<sku>();
for (int i = 0; i < skus.Count; i++)
{
    // Let's assign item to skus[i] immediately, we don't need a new instance here when we're later re-pointing to an existing instance
    sku item = skus[i];
    // Use LINQ Any function to determine whether there are any existing SKU's already
    bool existingSku = CompanyDbContext.skus.Any(s => s.item_no == item.item_no);
    // There are no duplicates, let's add this sku item to our temporary List
    if(!existingSku) 
    {
        tempSkus.Add(item);
    }
}
// Add the Range of tempSkus List to the CompanyDbContext
CompanyDbContext.skus.AddRange(tempSkus);
CompanyDbContext.SaveChanges();
Or if you prefer LINQ
// Create a new temporary list
List<sku> tempSkus = skus.Where(p => CompanyDbContext.skus.Any(s => s.item_no != p.item_no)).ToList();
// Add the Range of tempSkus List to the CompanyDbContext
CompanyDbContext.skus.AddRange(tempSkus);
CompanyDbContext.SaveChanges();