【问题标题】:How to delete duplicates from structure array with int and string components如何从具有 int 和 string 组件的结构数组中删除重复项
【发布时间】:2015-12-08 21:39:01
【问题描述】:

在我的项目中,我有

struct Cities{public int Name;public int n}

int n代表一个城市的人口。

我还有cities[] c;,该数组将填充城市的姓名和公民人数。

例子:

c[0].Name="New York";c[0].n=845698;

我需要编写一个方法,从数组中删除所有具有相同名称(如果有的话)的城市,并将它们的人口添加到第一个。

【问题讨论】:

  • 想一想您将如何手动完成并自动完成:对于每个城市,将其放入另一个结构中;查看原始结构中是否有重复项。如果有,求和它们的种群并将它们添加到新结构中;然后从原始结构中删除它们,这样您就不必再“查看”它们了。继续前进,直到第一个结构中没有任何东西。
  • 首先,数组是一个非常糟糕的选择,因为您不能从数组中删除一行,即使是新的,您也需要预先知道其大小。

标签: c# arrays struct


【解决方案1】:

应该这样做:

    struct Cities
    {
        public string name;
        public int n;
    }

    [Test]
    public void SomeMethod()
    {
        Cities[] c = new Cities[7];

        c[0].name = "new york";
        c[0].n = 10;
        c[1].name = "detroit";
        c[1].n = 20;
        c[2].name = "las vegas";
        c[2].n = 30;
        c[3].name = "new york";
        c[3].n = 40;
        c[4].name = "detroit";
        c[4].n = 50;
        c[5].name = "chicago";
        c[5].n = 60;
        c[6].name = "chicago";
        c[6].n = 70;

        c = c.GroupBy(ct => ct.name)
            .Select(cl => new Cities
            {
                name = cl.First().name,
                n = cl.Sum(ct => ct.n)
            }).ToArray();

        foreach (var city in c)
        {
            Console.WriteLine($"city={city.name}, pop={city.n}");
        }
    }

【讨论】:

  • 您可以通过将name = cl.First().name 替换为name = cl.Key 来节省一点开销。
【解决方案2】:

如果情况和你描述的一样简单,你可能需要考虑一个

Dictionary<string, int>

然后您将永远不会添加重复的城市,而是如果城市已经存在(使用 trygetvalue(key, out value) 或其他东西),您只需添加人口。

否则,您只能通过简单的搜索来查找重复项,以及合并重复项并删除其中一个的例程。

【讨论】:

  • 嗯,我需要将名称和人口从 .txt 文件输入到数组,所以我不知道这是否可行。我也不熟悉字典
猜你喜欢
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
相关资源
最近更新 更多