【问题标题】:Is there a way to remove range of items in string array C# [closed]有没有办法删除字符串数组C#中的项目范围[关闭]
【发布时间】:2017-10-05 14:12:32
【问题描述】:

例如

 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:00AM”和“10:30AM”之间的项目

【问题讨论】:

  • 最简单的解决方案是从这些时间创建 TImeSpan 对象并使用 linq
  • 数组是固定大小的,你不能从中删除元素。您需要创建一个将数组转换为集合的方法,删除指定的值范围并返回一个新数组减去已删除的项目。
  • 你能给我一些教程吗先生。非常感谢
  • 你的 vales 是字符串。现在,我(人类)可以理解“早上 7:00 到 10:30 之间”的意思,但计算机只看到一个字符串。你必须先告诉计算机你的字符串代表时间,然后我们再接近一点。
  • oras.ToList() 然后声明另一个列表,例如var excluded = new List<string> { "07:00AM", "07:30AM", "08:00AM", "08:30AM", "09:00AM", "10:00AM", " 10:30AM" },然后使用oras.Except(excluded).ToArray()(详见stackoverflow.com/questions/8032394/…)。

标签: c# arrays


【解决方案1】:

步骤:

  • 转换为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));
    }

【讨论】:

  • 谢谢先生,它更现实
  • 我觉得你的 Where linq 会给你所有你不想要的值,而不是值列表减去你不想要的值。
  • @Skintkingle 注意条件前的!
  • 啊,是的!我现在注意到了!为你 +1!
  • 当你只是一个学生和你的教授给你的项目时,这很糟糕。是上课安排:(
【解决方案2】:

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

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

【讨论】:

  • 很高兴为您提供帮助:)
【解决方案3】:

简短的回答,不。您不能直接“删除”或“添加”到数组。

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

然而,这并没有回答您实际提出的问题,对于任何给定的字符串集,您如何有条件地删除其中的一部分。

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

是时候了吗?

鉴于您的示例数据,如果您知道它们都是“时间”字符串,您应该解析为强类型时间对象,可能像这样TimeSpan

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

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

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

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

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

只是字符串吗?

如果它只是数组中的任意字符串值,我们仍然可以删除理论上的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();

这将删除两个其他字符串值之间的字符串Range。但是,这将所有字符串都按面值计算,其中它们的内容分别基于它们的字符值并以这种方式进行比较。如果有任何数据可以考虑,如果它是强类型的,则不会在纯字符串比较中考虑。

希望这会有所帮助。

【讨论】:

  • 感谢您的努力,先生。我真的很感激它非常感谢
  • 我刚刚添加了一个纯字符串比较,如果您的时间数据只是一个示例,而您实际上需要字符串范围。
【解决方案4】:

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

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

【讨论】:

  • 感谢@pavel Agarkov
【解决方案5】:

另一种可能的变体:

  • 将您的列表项转换为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();
    

【讨论】:

    【解决方案6】:

    如果你可以使用 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();
    

    【讨论】:

    • 谢谢你的回答我也试试这个
    • 不客气 :)
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多