【问题标题】:Class to return different types - best option?返回不同类型的类 - 最佳选择?
【发布时间】:2018-12-15 12:18:09
【问题描述】:

我需要一个可以与字符串属性一起使用的类,以将数据存储在结构化(类)列表中,但在同一类型的列表中,我需要一种方法来返回一个索引,该索引作为我设置数据所需的顺序。

类可以是这样的:

public class MyClass
{
    public int int1 = 0;
    public int int2 = 0;
    public int int3 = 0;
    public int int4 = 0;

    public string string1 { get; set; }
    public string string2 { get; set; }
    public string string3 { get; set; }
    public string string4 { get; set; }
}

然后我可以使用我的类以类结构化格式存储数据:

string fileName = @"C:\Mylocation\MyTextFileToRead.txt";    //tab delimeted file
Encoding fileEncoding = Encoding.ASCII;
List<MyClass> myDataList = new List<MyClass>();
List<string> simpleData = File.ReadAllLines(fileName, fileEncoding).ToList();
MyClass index = new MyClass();

foreach (var line in simpleData)
{
    var lineSplit = line.Split('\t');
    MyClass myClassElement = new MyClass
    {
        string1 = lineSplit[index.int1],
        string2 = lineSplit[index.int2],
        string3 = lineSplit[index.int3],
        string4 = lineSplit[index.int4],
    };
    myDataList.Add(myClassElement);

}

我使用索引来映射文本文件中的每个属性,然后将每个字段值存储在相应的字符串属性中。

我不希望使用对象类型并具有返回字符串值并将其转换为索引的 (int) 的属性。我被建议不要尽可能多地使用对象。 除非我使用类的类型名称(而不是类的实例),否则 Const 字段的使用对索引不起作用,但我不知道它是否有帮助或者这是否是一个更好的编程选项。

我不确定是否有更好的方法来做到这一点,但非常欢迎提供相关反馈。

【问题讨论】:

  • 对我来说这感觉不对,您的课程与您的文件无关,所以您为什么要存储订单,我不明白这有什么关系。从您的示例中,您只需要读取文件时的顺序。
  • 文本文件具有我知道顺序的属性,索引是我知道拆分后需要去哪个字段的人。顺序是关键。
  • 你没有得到好的建议,总是避免字符串输入。当文件结构发生变化时,您必须更改类声明是正常的和预期的。无论如何,当您使用字符串输入时,您已经进行了更改,它们将更难正确。
  • 仍然没有意义。如果您的文本文件知道顺序,则您的班级不需要知道它。只需将正确的数据推送到类的属性,也许您可​​以显示您的文件数据?
  • 对于每个字符串 -> prop1 + '\t' + prop2+ '\t' + prop3+ '\t' + prop4 但是如何设置拆分顺序?

标签: c# class


【解决方案1】:

要从一个函数返回两种不同的类型,您可以使用introduce in C# 7.3 的方式

它是这样工作的:

public (int, string) MyFunc()
{
    //do something
    return (VarThatInt, VarThatString);
}

//and in main class u call it like this:

(varInt, varString) = MyFunc();

【讨论】:

  • 我只限于c#4
  • 你没有提到,所以你能把你的downbote叫回来吗?
  • OP 不能投票,因为您需要有 125 声望才能这样做。我不知道是谁做的,但您的回答绝对不值得一票否决。 -- 顺便说一句,你所建议的称为 Tuple。 :)
  • @Visual Vincent:我是新手,抱歉。 “元组”是什么意思?
  • @ptuga :这是 michasaucer 在他/她的回答中建议的。元组简单地说就是一组按一定顺序排列的元素。 (int, string) 是一个包含 int 和 string 的元组。
【解决方案2】:

使用KeyValuePair存储一个属性和索引,使用KeyValuePair列表存储一行,使用dic Dictionary存储文件。

      List<int> orderIndexList = new List<int> { 2, 1, 4, 0 };
        Dictionary<int, List<KeyValuePair<int, string>>> data = new Dictionary<int, List<KeyValuePair<int, string>>>();

        int lineNumber = 0;
        foreach (var line in simpleData)
        {
            var lineSplit = line.Split('\t');
            List<KeyValuePair<int, string>> listLine = new List<KeyValuePair<int, string>>();
            orderIndexList.ForEach(index => listLine.Add(new KeyValuePair<int, string>(index, lineSplit[index])));
            data.Add(++lineNumber, listLine);
        }
        return data;

【讨论】:

  • 我肯定想使用一个类。
【解决方案3】:

返回具有两个所需输出的类。您甚至可以返回第三个变量来告诉接收代码使用哪个输出。

public myClass{   
  String TextValue;
  int NumberValue;
  bool IsReturnString; 
}

您将返回myClass 的对象。

【讨论】:

  • inf 字段完全可以是只读的,但字符串需要存储数据才能使用该结构存储数据并将其提供给列表。我的课可以是最好的解决方案。我只需要知道我介绍的内容是否合适,是否有更好的选择。
  • 在拆分后的foreach循环中使用索引`index = 0; var lineSplit = line.Split('\t'); MyClass myClassElement = new MyClass { string1 = lineSplit[index], string2 = lineSplit[++index], string3 = lineSplit[++index], string4 = lineSplit[++index], // ... // string.. . = lineSplit[++index],如果存在更多属性 };` 似乎是逻辑?
  • 之所以有效,是因为规则是第一个属性获取索引 0,最后一个属性获取索引 n。但是,如果我有很多属性,是否可以使用循环来设置每个属性?据我所知,Reflection 可以为您提供名称,但不能提供我需要的属性本身。类似于myClassElement.PROP = lineSplit[index]; 的东西,其中索引从零循环到 n,而“PROP”从属性 1 循环到属性 n。那将是我理想的解决方案。有这种事吗?
  • @ptuga :除了可能有更好的解决方案之外,我不知道您为什么不应该使用反射,不。作为记录,在某些情况下有一些方法可以使反射更快:stackoverflow.com/a/1028058
  • @ptuga :属性的设置者,即PropertyInfo.SetMethod。但是,如果您只设置每个属性一次,它不会有所作为。尽管就像答案所暗示的那样,您可以尝试其他替代反射的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多