【问题标题】:C# Creating Collection Out of 2 Arrays In different Class. Use Linq to Select/FromC# 从不同类中的 2 个数组中创建集合。使用 Linq 选择/从
【发布时间】:2015-11-16 15:13:18
【问题描述】:

这是我的问题。我有 2 个这样的数组。

    string[] fruit1 = { "Apple", "Banana", "Orange", "Pear", "Strawberry", "Grape", "Kiwi" };
        string[] fruit2 = { "Peach", "Nectarine", "Banana", "Cherry" };

我被要求创建第二个班级。添加“几个略有不同的属性”。然后使用 Linq 从第一个类中选择/从第一个类中创建一个排序集合,在第二个类中消除重复项(“香蕉”)。

在被告知我需要合并第二个类和 select/from 之前,这是我的工作。排序是作业的一部分。他们工作正常。这个程序运行良好。唯一的问题是,在我发送之后,我被告知了第二节课的全部内容。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MergeArray
{
  class Program
  {
    static void Main(string[] args)
    {
        string[] fruit1 = { "Apple", "Banana", "Orange", "Pear", "Strawberry", "Grape", "Kiwi" };
        string[] fruit2 = { "Peach", "Nectarine", "Banana", "Cherry" };
        string[] fruit3 = new string[fruit1.Length + fruit2.Length];

        string temp;

        foreach (string i in fruit1)
        {
            for (int j = 0; j < fruit1.Length - 1; j++)
            {
                if (String.Compare(fruit1[j], fruit1[j + 1]) > 0)
                {
                    temp = fruit1[j];
                    fruit1[j] = fruit1[j + 1];
                    fruit1[j + 1] = temp;
                }
            }
        }
        foreach (string i in fruit2)
        {
            for (int j = 0; j < fruit2.Length - 1; j++)
            {
                if (String.Compare(fruit2[j], fruit2[j + 1]) > 0)
                {
                    temp = fruit2[j];
                    fruit2[j] = fruit2[j + 1];
                    fruit2[j + 1] = temp;
                }
            }
        }

        fruit1.CopyTo(fruit3, 0);
        fruit2.CopyTo(fruit3, names1.Length);

        Console.WriteLine(String.Join(Environment.NewLine, fruit3.Distinct().ToArray()));
        Console.ReadLine();

    }
}
}

所以我的问题是。我如何将前 2 个数组传递给外部类,然后我可以使用它们在外部类中创建构造函数(fruit3)?然后,返回新的构造函数以显示新的合并/排序构造函数(不重复)“Apple”、“Banana”、“Grape”、“Kiwi”、“Orange”、“Pear”、“Strawberry”、“樱桃”、“油桃”、“桃子”?

【问题讨论】:

  • 你一直在谈论类,但我在你的代码中没有看到任何东西,除了 Program 类...在它因为不够清楚而被关闭之前快点整理一下。
  • 对不起。该代码更像是我试图获得的输出的一个示例。我没有制作其他课程,因为我不知道如何将数组传递给新课程。如果我放一个,它只是空的。如果我的问题不清楚,我很抱歉。我只是在寻求帮助,以便能够将前两个数组传递到要定义的第二个类中。
  • 寻求帮助的第一步是提出正确的问题。
  • @MihaiCaracostea 好的,请允许我澄清一下。再次,我很抱歉我的问题不清楚。我需要能够创建一个具有两个“略有不同的属性”的新类(这是给我的,这是我必须继续做的,对不起)。无论如何,在这个新类中,我需要能够使用 Linq select/from 从两个数组(fruit1 和fruit2)中创建一个集合。有人告诉我使用反射应该会有所帮助,但是在将数组传递给第二个(尚未定义的)类的情况下,我查找的所有内容并没有真正帮助我。然后将它们合并到集合中。
  • 前 2 个数组(fruit1 和fruit2)需要在我需要制作的第二个类的范围之外定义。但我需要能够将它们的值传递给第二个类才能创建集合。数组需要单独排序(按照我的方式)。我实际上在原始问题中搞砸了(在我的编辑中澄清了)。它们分别排序,然后合并在一起,而不是对最终集合进行排序,这就是它需要的方式。我的主要问题是在第二堂课中进行所有合并。

标签: c# arrays linq inheritance collections


【解决方案1】:

通过使用ConcatDistinctOrderBy

string[] fruit3 = 
    // concat these 2 togather
    fruit1.Concat(fruit2)
        // remove any duplicates
        .Distinct()
        // order them
        .OrderBy(x => x)
        // finally, converts IEnumerable<string> to string[]
        .ToArray();

至于在类之外使用它们,您需要将它们移到Main() 方法之外。由于局部变量不能在声明方法之外的任何地方访问,除非您将其作为 via 参数传递。您还需要在它们前面加上access modifierpublic,因为您需要在Program 类之外访问它们,例如:

class Program
{
    public string[] fruit1 = { "Apple", "Banana", "Orange", "Pear", "Strawberry", "Grape", "Kiwi" };
    public string[] fruit2 = { "Peach", "Nectarine", "Banana", "Cherry" };

    // ...
}

public 关键字是类型和类型成员的访问修饰符。 公共访问是最宽松的访问级别。没有 访问公共成员的限制。

编辑 2:有很多方法可以让 Names 类做到这一点。这是一个例子:

class Program
{
    static void Main(string[] args)
    {
        string[] fruit1 = { "Apple", "Banana", "Orange", "Pear", "Strawberry", "Grape", "Kiwi" };
        string[] fruit2 = { "Peach", "Nectarine", "Banana", "Cherry" };
        string[] fruit3 = Names.UniqueSortedJoin(fruit1, fruit2);
    }
}

class Names
{
    public static string[] UniqueSortedJoin(string[] names1, string[] names2)
    {
        return names1.Concat(names2)
            .Distinct()
            .OrderBy(x => x)
            .ToArray();
    }
}

【讨论】:

  • 感谢您的回答,但我不确定这是否有助于在课外进行。我已经尝试使用您的示例,通过将两个数组移到 main 之外,然后创建一个新类(我不知道如何在 cmets 中编写代码,所以对我来说很简单)public class Names{}。然后尝试在 Names 类的顶部使用您的示例。这也无助于我在填充集合之前需要使用 Names 类中的两个属性(每个分配给我的人都需要)的困惑。
  • 如何在 Names 类中做到这一点,这是我的问题。所以我有一个“程序”类,其中包含数组的所有代码和数组的排序,然后我需要有一个“名称”类来获取两个数组并将它们合并到集合中。
  • 虽然这不是我想要做的,但我所要做的就是摆脱“.OrderBy(x =
  • 哦...我这样做是因为您提到了“合并/*排序*构造函数”。
猜你喜欢
  • 2022-08-18
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 2022-01-17
  • 2010-09-07
  • 2015-11-28
相关资源
最近更新 更多