例如
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”之间的项目
答案 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();