根据条件对列表进行分区的最简单方法是什么?
What is the simplest way to partition a list based on a criteria?
比方说,我们有这样一个对象定义,
class MyObject {
int id;
string name;
}
我们有一个 MyObjects 列表。
List<MyObject> objectList
现在,我需要根据哪些对象具有非空名称字段将此 objectList 分成 2 个子列表。
因此,在操作之后,我需要有 2 个列表,objectsWithName
其中名称字段为非空,objectsWithoutName
其中名称字段为空(这是直接标准,但我我更倾向于使用谓词划分为 2 个组)。
实现此目的的最简单方法是什么?我可以在一次操作中完成吗?允许使用 LINQ。
两个 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);
}
}
我认为您正在寻找与此示例类似的内容:
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
属性 不为空,否则为第二个列表。
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");
}
比方说,我们有这样一个对象定义,
class MyObject {
int id;
string name;
}
我们有一个 MyObjects 列表。
List<MyObject> objectList
现在,我需要根据哪些对象具有非空名称字段将此 objectList 分成 2 个子列表。
因此,在操作之后,我需要有 2 个列表,objectsWithName
其中名称字段为非空,objectsWithoutName
其中名称字段为空(这是直接标准,但我我更倾向于使用谓词划分为 2 个组)。
实现此目的的最简单方法是什么?我可以在一次操作中完成吗?允许使用 LINQ。
两个 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);
}
}
我认为您正在寻找与此示例类似的内容:
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
属性 不为空,否则为第二个列表。
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");
}