1

我有以下名为 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) 从具有空文本字段的详细信息中删除任何 CityDetails?

  • b) 添加到详细信息以使其具有六个 City.Detail 记录,如果它少于六个?

4

3 回答 3

1

您的第一个问题可以通过使用此“查询”来解决:

Details = Details.Where(cityDetail=>cityDetail.Text != null && !string.IsNullOrEmpty(cityDetail.Text.TextWithHtml)).ToList();

这将覆盖您的详细信息 var 并使用新列表,仅包括非空项目。


至于您的第二个问题-您并不清楚您想做什么,您需要向我们提供更多详细信息/解释

编辑:
IEnumerable(T) 表示只读集合,这意味着它不支持按定义删除项目。当然你可以添加你自己的 RemoveWhere 扩展方法,但它本质上和我在这里做的一样

于 2012-05-19T12:09:12.600 回答
1

@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();
于 2012-05-19T12:23:39.343 回答
0

一种)

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();
于 2013-05-11T14:38:03.697 回答