有没有办法删除字符串数组C#中的项目范围

时间:2017-10-03 08:45:54

标签: c# arrays

例如

 private string[] oras = { "07:00AM", "07:30AM", "08:00AM", "08:30AM", "09:00AM", "10:00AM", " 10:30AM", "11:00AM", "11:30AM", "12:00PM", "12:30PM", "01:00PM", "01:30PM", "02:00PM", "02:30PM", "03:00PM", "03:30PM", "04:00PM", "04:30PM", "05:00PM", "05:30PM", "06:00PM", "06:30PM", "07:00PM", "07:30PM", "08:00PM" };

我想删除“上午7:00”和“上午10:30”之间的项目

6 个答案:

答案 0 :(得分:3)

步骤:

  • 转换为TimeSpan;
  • 过滤时间跨度不符合您标准的地方;
  • 可选择转换回字符串和/或数组。

代码:

var orasTs = oras.Select(o => ParseTimeSpan(o))
                 .Where(ts => !(ts.TotalHours >= 7 && ts.TotalHours <= 10.5f))
                 .ToArray();

    private static TimeSpan ParseTimeSpan(string t)
    {
        int hoursToAdd = 0;

        if (t.EndsWith("AM"))
        {
            hoursToAdd = 0;
        }
        else
        {
            hoursToAdd = 12;
        }

        return TimeSpan.Parse(t.Substring(0, 5)).Add(TimeSpan.FromHours(hoursToAdd));
    }

答案 1 :(得分:1)

你可以试试这个。我在这里做的是我先转换时间并根据你的情况选择。然后返回第一个结果不匹配的结果:

string[] oras = { "07:00AM", "07:30AM", "08:00AM", "08:30AM", "09:00AM", "10:00AM", " 10:30AM", "11:00AM", "11:30AM", "12:00PM", "12:30PM", "01:00PM", "01:30PM", "02:00PM", "02:30PM", "03:00PM", "03:30PM", "04:00PM", "04:30PM", "05:00PM", "05:30PM", "06:00PM", "06:30PM", "07:00PM", "07:30PM", "08:00PM" };

var res = oras.Where(c => DateTime.Parse(c) >= DateTime.Parse("07:00AM") && DateTime.Parse(c) <= DateTime.Parse("10:30AM"))
                .ToArray();

var result = oras.Where(b => !res.Any(c => c == b)).ToArray();

答案 2 :(得分:1)

简短的回答,没有。你不能&#34;删除&#34;或&#34;添加&#34;直接到数组。

但是,您可以使用Array.Resize来调整引用的数组的大小,或者直接创建一个具有不同元素数的新数组。

然而,这并没有回答你实际上要求的问题,对于任何给定的字符串集,你如何有条件地删除它们中的一部分。

我会假设前进你是/可以使用linq(System.Linq),我们将使用oras

是时候了吗?

根据您的示例数据,如果您知道他们将全部是&#34;时间&#34;字符串,您应该解析为强类型的时间对象,可能TimeSpan像这样

var myTimeSpans = oras.Select(o => TimeSpan.Parse(o));

使用新的TimeSpan实例列表,然后您可以使用Linq Where语句仅选择您想要的元素。

var myWantedTimespans = myTimeSpans.Where(ts => ts.TotalHours < 7 || ts.TotalHours > 10.5f);

这将使所有TimeSpans的总小时数小于7或大于10.5。根据不同的条件要求进行修改。

然后,您可以在新集合中以强类型方式进一步使用它们,或者将它们转换为字符串,以用于您可能具有的任何字符串类型的目的。

这只是字符串吗?

如果它只是数组中的任意字符串值,我们仍然可以删除理论Range,但它更麻烦。如果以字符值取字符串,则可以使用基本字符串比较器删除Range。例如:

string lower = "07:00AM";
string upper = "10:30AM";
var newArray = oras.Where(f => string.Compare(f, lower) < 0 || string.Compare(f, upper) > 0).ToArray();

这将删除2个其他字符串值之间的字符串Range。然而,这是采用面值的所有字符串,其内容基于它们的字符值单独地进行比较并以这种方式进行比较。如果有任何数据可以被考虑,如果它是强类型的方式,这将不会被视为仅字符串比较。

希望这有帮助。

答案 3 :(得分:0)

看起来你在这里玩得很开心:) 这是我的意识:

string format = "hh:mmtt";
DateTime excludeStart = DateTime.ParseExact("07:00AM", format, CultureInfo.InvariantCulture),
    excludeEnd = DateTime.ParseExact("10:30AM", format, CultureInfo.InvariantCulture);
var result = oras
     .Select(str => DateTime.ParseExact(str.Trim(), format, CultureInfo.InvariantCulture))
     .Where(ts => ts < excludeStart || ts > excludeEnd)
     .Select(ts => ts.ToString("hh:mmtt"))
     .ToArray();

您可以运行here

答案 4 :(得分:0)

另一种可能的变体:

  • 将您的列表项转换为DateTime
  • 计算给定范围的项目数
  • 计算范围的起始元素索引
  • 使用RemoveRange()方法,在从数组中创建列表后
  • 转换回字符串数组

    string[] oras = { "07:00AM", "07:30AM", "08:00AM", "08:30AM", "09:00AM", "10:00AM", " 10:30AM", "11:00AM", "11:30AM", "12:00PM", "12:30PM", "01:00PM", "01:30PM", "02:00PM", "02:30PM", "03:00PM", "03:30PM", "04:00PM", "04:30PM", "05:00PM", "05:30PM", "06:00PM", "06:30PM", "07:00PM", "07:30PM", "08:00PM" };
    
    int elementsCount = oras.Select(DateTime.Parse)
                    .Count(c => c >= DateTime.Parse("07:00AM")
                             && c <= DateTime.Parse("10:30AM"));
    
    int startIndex = Array.IndexOf(oras, "07:00AM");
    
    List<string> orasList = oras.ToList();
    orasList.RemoveRange(startIndex, elementsCount);
    oras = orasList.ToArray();
    

答案 5 :(得分:-1)

如果可以使用List,则可以使用List.RemoveRange (MSDN

List<string> listHour = new List<string>();
foreach(var item in oras){
    listHour.Add(item);
}
listHour.RemoveRange(1,4);
oras = listHour.ToArray();