检查集合是否为空。

15
public ActionResult Create(FormCollection collection, FormCollection formValue)
{
    try
    {
        Project project = new Project();

        TryUpdateModel(project, _updateableFields);

        var devices = collection["devices"];
        string[] arr1 = ((string)devices).Split(',');
        int[] arr2 = Array.ConvertAll(arr1, s => int.Parse(s));

        project.User = SessionVariables.AuthenticatedUser;
        var time = formValue["Date"];
        project.Date = time;
        project.SaveAndFlush();

        foreach (int i in arr2)
        {
            Device d = Device.Find(i);
            d.Projects.Add(project);
            d.SaveAndFlush();
        }

        return RedirectToAction("Index");
    }
    catch (Exception e)
    {
        return View(e);
    }
}

我想将foreach语句包裹在if语句中,以检查是否

var devices = collection["devices"];

判断是否为空。如果它是空的,则不应执行for each循环。为了记录,collection["devices"]是表单中复选框值的集合。

6个回答

18

您可以使用 Count 字段来检查集合是否为空。

因此,您最终会得到类似于以下的内容:

if(devices.Count > 0)
{
   //foreach loop
}

是的,我实际上已经尝试过了,但它给了我一个错误:错误1:'string'不包含定义为'Count'的内容,也没有接受类型为'string'的第一个参数的扩展方法'Count'(您是否缺少使用指令或程序集引用?) - Prd
尝试使用Count() https://msdn.microsoft.com/zh-cn/library/vstudio/bb338038%28v=vs.100%29.aspx ,因为我认为FormCollection是IEnumerable。 - danio
1
如果您正在使用 IMongoCollection,则需要使用 YourCollection.AsQueryable().Count() == 0 - Mauricio Gracia Gutierrez

15
您可以使用方法Any来判断一个集合是否有任何元素。
if (devices.Any())
{
   //devices is not empty
}

6
如果你的集合不是IEnumerable类型,建议使用Count或Length代替Any()方法进行简单检查,因为Any()方法是LINQ方法,会给你带来太多开销。 - TOP KEK
2
对于 ICollection<TSource> 或旧式的非泛型 ICollection,LINQ 的 Any() 方法只是简单地通过传递 count!=0 来实现,因此在大多数情况下,例如 IList 或数组,开销是可以忽略不计的(甚至可以进行优化)。即使在 IIListProvider<TSource> 的情况下,它也会获取 count,只有当它很便宜时才会执行单个 MoveNext - 因此比您建议的计数更快。简而言之:没有理由不使用 Any() - mbx
如果您正在使用 IMongoCollection,则需要使用 YourCollection.AsQueryable().Count() == 0 - Mauricio Gracia Gutierrez

10

您无需检查集合是否为空,如果为空,则不会执行ForEach内的代码。请参阅以下示例:

using System;
using System.Collections.Generic;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> emptyList = new List<string>();

            foreach (string item in emptyList)
            {
                Console.WriteLine("This will not be printed");
            }

            List<string> list = new List<string>();

            list.Add("item 1");
            list.Add("item 2");

            foreach (string item in list)
            {
                Console.WriteLine(item);
            }

            Console.ReadLine();
        }
    }
}

是的,我很抱歉,我是个白痴。在尝试if语句时,我误读了错误信息。它并不是由于forearch尝试遍历一个空集合而引起的。将转换为int数组的操作放在if语句内部可以解决这个问题。 - Prd
这并不是标题问题的答案,但从主题所有者提出的问题来看,这是最好的答案。首先无需检查空值;-) 我投赞成票。 - Ingmar

1

你的代码目前无法工作,因为你说collection["devices"]是一个复选框值的集合,但你却将其转换为string。你的意思是collection是复选框的值吗?collection的确切类型是什么?

任何实现ICollectionICollection<T>的对象都可以通过检查Count属性是否大于零来检查它是否为空。


这是一个FormCollection。我将其转换为int数组,以便可以处理值。我已更新代码以显示整个操作,现在它可以正常工作。只要选择至少1个复选框,此代码就可以正常运行。 - Prd
formcollection仅返回包含数据的控件。这是正常行为。 - Roadie57

0
这对我在Dot Net Core中有效,但仅适用于模型的IEnumerable而不是实体(我从AutoMapper获取了一点帮助)
将其转换为List,然后检查Capacity。
IEnumerable<vwPOD_Master> podMasters = _podRepository.GetNewPods(PartNumber);

IEnumerable<NewPODsDTO> podList = Mapper.Map<IEnumerable<NewPODsDTO>>(podMasters);

if (((List<NewPODsDTO>)podList).Capacity == 0) {
    return NotFound(); 
}

0

检查数组长度怎么样?

if (arr2.length > 0)
{
    foreach (int i in arr2)
    {
        Device d = Device.Find(i);
        d.Projects.Add(project);
        d.SaveAndFlush();
    }
}

那么变量devices返回的类型与您期望的不同。 - Roadie57
1
如果人们不使用 var,大多数人会更加快乐... - Ondrej Tucny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接