1

値が

StatusList = new List<StatusData>
                {
                    new StatusData {Count = 0, Id = 1},
                    new StatusData {Count = 0, Id = 2},
                    new StatusData {Count = 1, Id = 3},
                    new StatusData {Count = 0, Id = 4},
                    new StatusData {Count = 2, Id = 5},
                    new StatusData {Count = 3, Id = 6},
                    new StatusData {Count = 0, Id = 7},
                    new StatusData {Count = 0, Id = 8},
                    new StatusData {Count = 0, Id = 2}
                };

ゼロの要素を削除して、リストの左側と右側をトリムするにはどうすればよいですか?

4

5 に答える 5

4
int start = 0, end = StatusList.Count - 1;

while (start < end && StatusList[start].Count == 0) start++;
while (end >= start && StatusList[end].Count == 0) end--;

return StatusList.Skip(start).Take(end - start + 1);
于 2013-03-28T08:43:53.580 に答える
2

LINQ の使用:

var nonEmptyItems = StatusList.Where(sd => sd.Count > 0);

nonEmptyItemsCount中央のアイテムを含め、0 より大きいアイテムが含まれます。

または、中央のアイテムを削除したくない場合は、while ループを使用して、そのようなアイテムが存在しなくなるまで、空のアイテムを前後から削除できます。

var trimmed = false;
while(!trimmed)
{
  if(StatusList[0].Count == 0)
     StatusList.RemoveAt(0);

  if(StatusList[StatusList.Count - 1].Count == 0)
    StatusList.RemoveAt(StatusList.Count - 1);

  if(StatusList[0].Count == 0 > StatusList[StatusList.Count - 1].Count > 0)
    trimmed = true;
}
于 2013-03-28T08:41:37.863 に答える
2
// Remove until count != 0 is found
foreach (var item in StatusList.ToArray())
{
    if (item.Count == 0)
        StatusList.Remove(item);
    else
        break;
}
// Reverse the list
StatusList.Reverse(0, StatusList.Count);
// Remove until count != 0 is found
foreach (var item in StatusList.ToArray())
{
    if (item.Count == 0)
        StatusList.Remove(item);
    else
        break;
}
// reverse back
StatusList.Reverse(0, StatusList.Count);
于 2013-03-28T08:47:18.357 に答える
1

あまり効率的ではありませんが、より読みやすい解決策は次のとおりです。

StatusList.Reverse();
StatusList = StatusList.SkipWhile(x => x.Count == 0).ToList();
StatusList.Reverse();
StatusList = StatusList.SkipWhile(x => x.Count == 0).ToList();
于 2016-04-19T16:43:03.797 に答える
0

これが私がそれを解決した方法です...

RemoveOutsideZeros(ref StatusList);
                StatusList.Reverse();
RemoveOutsideZeros(ref StatusList);


private void RemoveOutsideZeros(ref List<StatusData> StatusList)
{
    bool Found0 = false;
    foreach (StatusData i in StatusList.ToList())
    {
        if (i.Count != 0)
    {
        Found0 = true;
    }
        if (i.Count == 0 && Found0 == false)
        {
            StatusList.Remove(i);
        }
    }

}

于 2013-03-28T10:06:20.110 に答える