1

Detail という別のクラスを含む City という次のクラスがあります。

 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();

私は2つのことができる必要があります。誰かがこれを行うための最良の方法を教えてもらえますか? できればLINQを使用してください。

  • a) 空の Text フィールドを持つ CityDetails を Details から削除しますか?

  • b) 詳細に追加して、City.Detail レコードが 6 つ未満の場合は 6 つにしますか?

4

3 に答える 3

1

@YavgenyP は最初の質問によく答えてくれました。2番目の質問については、次のことをお勧めします。

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 に答える
1

最初の質問は、次の「クエリ」を使用して解決できます。

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

これにより、ur details var がオーバーライドされ、空でないアイテムのみを含む新しいリストが作成されます。


あなたの2番目の質問の時点で、あなたが何をしたいのかはっきりしていないので、詳細/説明を提供する必要があります

編集:
IEnumerable(T) は読み取り専用のコレクションを表します。つまり、定義によるアイテムの削除はサポートされていません。もちろん、独自の RemoveWhere 拡張メソッドを追加することもできますが、基本的にはここで行ったのと同じことを行います。

于 2012-05-19T12:09:12.600 に答える
0

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