如何使用 LINQ 在集合中添加和删除记录
本文关键字:添加 删除 记录 集合 何使用 LINQ | 更新日期: 2023-09-27 18:34:44
我有以下名为City的类,其中包含另一个名为Detail的类。
public class City
{
public override string PartitionKey { get; set; }
public override string RowKey { get; set; }
public string Title { get; set; }
public class Detail {
public Detail() {
Text = new HtmlText();
}
public HtmlText Text { get; set; }
}
}
公共类 HtmlText {
public HtmlText()
{
TextWithHtml = String.Empty;
}
[AllowHtml]
public string TextWithHtml { get; set; }
}
在我的代码中,我使用以下内容来创建详细信息列表。后来我填充了一些细节,但不是全部。
IList<City.Detail> Details = Enumerable.Range(1,6).Select(x => new City.Detail()).ToList();
我需要能够做两件事。有人可以告诉我最好的方法吗?希望使用 LINQ。
a( 从具有空文本字段的详细信息中删除任何城市详细信息?
b( 添加到详细信息以使其具有六个 City.Detail 记录(如果它少于六个(?
您的第一个问题可以通过使用此"查询"来解决:
Details = Details.Where(cityDetail=>cityDetail.Text != null && !string.IsNullOrEmpty(cityDetail.Text.TextWithHtml)).ToList();
这将覆盖您的详细信息 var 和新列表,仅包括非空项目。
至于您的第二个问题 - 不太清楚您想做什么,您需要向我们提供更多详细信息/解释
编辑:
IEnumerable(T( 表示只读集合,这意味着它不支持根据定义删除项目。当然,您可以添加自己的RemoveWhere扩展方法,但它本质上将执行与此处相同的操作
@YavgenyP很好地回答了你的第一个问题。对于第二个问题,以下是我的建议:
while (Details.Count < 6)
Details.Add(new City.Detail());
尝试使用 LINQ 执行此操作只会更糟糕(长度、可读性、速度(:
if (Details.Count < 6)
Enumerable.Range(1, 6 - Details.Count).Select(x =>
{
var d = new City.Detail();
Details.Add(d);
return d;
}).ToArray();
虽然我最喜欢他的解决方案,但这里有一些替代方法来回答第一个问题:
foreach (var toRemove in Details.Where(cityDetail => cityDetail.Text == null || string.IsNullOrEmpty(cityDetail.Text.TextWithHtml)))
Details.Remove(toRemove);
foreach (var toRemove in (from cityDetail in Details
where cityDetail.Text == null || string.IsNullOrEmpty(cityDetail.Text.TextWithHtml)
select cityDetail))
Details.Remove(toRemove);
(from cityDetail in Details
where cityDetail.Text == null || string.IsNullOrEmpty(cityDetail.Text.TextWithHtml)
select Details.Remove(cityDetail)).ToArray();
a(
Details =
Details
.Except(Details
.Where(d => string.IsNullOrEmpty(d.Text.TextWithHtml)))
.ToList();
b(
Details =
Details
.Concat(
Enumerable
.Range(1, 6 - Details.Count())
.Select(x => new City.Detail()))
.ToList();