根据条件对列表进行分区的最简单方法是什么?

时间:2018-11-21 09:01:48

标签: c# list linq ienumerable

比方说,我们有一个这样的对象定义,

class MyObject {
    int id;
    string name;
}

,我们有一个MyObjects列表。

List<MyObject> objectList

现在,我需要基于哪些对象具有非null名称字段将该对象列表划分为2个子列表。

因此,在操作之后,我需要有2个列表,其中objectsWithName的名称字段为非空,而objectsWithoutName的名称字段为空(这是直接条件,但我是希望使用谓词将其分为两组。

最简单的方法是什么?我可以一次执行此操作吗?允许使用LINQ。

3 个答案:

答案 0 :(得分:2)

两个LINQ语句可以做到:

var nameNotNull = objectList.Where(o => !string.IsNullOrEmpty(o.Name));
var nameNull = objectList.Where(o => string.IsNullOrEmpty(o.Name));

当然,您可以使用GroupBy,或更有效的foreach语句。

显示foreach选项:

List<MyObject> nameNotNull = new List<MyObject>();
List<MyObject> nameNull = new List<MyObject>();

foreach (MyObject o in objectList)
{
    if (!string.IsNullOrEmpty(o.Name))
    {
        nameNotNull.Add(o);
    }
    else
    {
        nameNull.Add(o);
    }
}

答案 1 :(得分:1)

public class MyObject
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class MyObjectLists
{
    private readonly List<MyObject> _objects;

    public List<MyObject> NullNameObjects
    {
        get
        {
            return _objects.Where(x => x.Name == null).ToList();
        }
    }

    public List<MyObject> NonNullNameObjects
    {
        get
        {
            return _objects.Where(x => x.Name != null).ToList();
        }
    }

    public MyObjectLists(List<MyObject> objects)
    {
        _objects = objects ?? throw new ArgumentNullException(nameof(objects));
    }
}

使用代码:

var list = new List<MyObject>
{
    new MyObject
    {
        Id = 1,
        Name = "John"
    },

    new MyObject
    {
        Id = 2
    },

    new MyObject
    {
        Id = 3,
        Name = "Mary"
    },

    new MyObject
    {
        Id = 4
    }
};

var objects = new MyObjectLists(list);

foreach (MyObject myObject in objects.NonNullNameObjects)
{
    Console.WriteLine($"Object with Id {myObject.Id} has a non-null name");
}

foreach (MyObject myObject in objects.NullNameObjects)
{
    Console.WriteLine($"Object with Id {myObject.Id} has a null name");
}

答案 2 :(得分:0)

我认为您正在寻找类似以下示例的内容:

class MyObject 
{
    int id;
    string name;
}

var objectList = new List<MyObject>();

objectList.Add(new MyObject { name = "item 1" });
objectList.Add(new MyObject { name = string.Empty });
objectList.Add(new MyObject { name = "item 3" });

var objectsWithName = objectList.Where(x => !string.IsNullOrEmpty(x.name));
var objectsWithoutName = objectList.Except(objectsWithName);

我创建了2个列表,第一个列表包含MyObject属性为name的{​​{1}}项,否则为null。