C# 类返回不同类型-最佳选项?

C# 类返回不同类型-最佳选项?,c#,class,C#,Class,我需要一个可以使用字符串属性的类来将数据存储在结构化(类)列表上,但类型相同的类可以返回一个索引,该索引充当我设置数据所需的顺序 该类可以类似于: 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 s

我需要一个可以使用字符串属性的类来将数据存储在结构化(类)列表上,但类型相同的类可以返回一个索引,该索引充当我设置数据所需的顺序

该类可以类似于:

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

}
stringfilename=@“C:\Mylocation\MyTextFileToRead.txt”//制表符删除文件
Encoding fileEncoding=Encoding.ASCII;
List myDataList=新列表();
List simpleData=File.ReadAllLines(文件名,fileEncoding.ToList();
MyClass索引=新的MyClass();
foreach(simpleData中的var行)
{
var lineSplit=line.Split('\t');
MyClass myClassElement=新的MyClass
{
string1=lineSplit[index.int1],
string2=lineSplit[index.int2],
string3=lineSplit[index.int3],
string4=lineSplit[index.int4],
};
添加(myClassElement);
}
我使用索引映射文本文件中的每个属性,然后将每个字段值存储在相应的字符串属性中

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


我不确定是否有更好的方法来实现这一点,但是如果有相关的反馈,我将非常欢迎。

要从一个函数返回两种不同的类型,您可以使用以前的方法

它的工作原理如下:

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

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

(varInt, varString) = MyFunc();

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

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

您将返回
myClass
的对象

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

      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;
List orderIndexList=新列表{2,1,4,0};
字典数据=新字典();
int lineNumber=0;
foreach(simpleData中的var行)
{
var lineSplit=line.Split('\t');
List listLine=新列表();
orderIndexList.ForEach(index=>listLine.Add(新的KeyValuePair(index,lineSplit[index]));
添加(++行号,列表行);
}
返回数据;

对我来说,这感觉不对,您的类与您的文件不相关,因此您为什么要存储订单,我看不出这有什么关系。从您的示例中,您只需要读取文件时的顺序。文本文件具有我知道顺序的属性,索引是我知道拆分后需要转到哪个字段的人。顺序是关键。你没有得到好的建议,总是避免严格打字。当文件结构发生更改时,您必须更改类声明,这是正常的,也是预期的。当你使用严格打字的时候,你已经做出了改变,这些改变将很难得到正确的结果。仍然没有意义。如果文本文件知道顺序,则类不需要知道。只需将正确的数据推送到类的属性,也许您可以显示您的文件数据?对于每个字符串->prop1+'\t'+prop2+'\t'+prop3+'\t'+prop4,但我如何设置拆分顺序?我仅限于c#4您没有提到过,所以您可以将您的downbote回调吗?OP无法进行向下投票,因为您需要有125个声誉才能进行向下投票。我不知道是谁做的,但你的答案绝对不值得投反对票顺便说一下,你的建议称为元组。:)@视觉文森特:对不起,我是新手。“Tuple”是什么意思?@ptuga:这是michasaucer在回答中提出的。元组就是一组按一定顺序排列的元素
(int,string)
是一个元组,包含一个
int
和一个
string
。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。但是,如果我有很多属性,是否可以使用循环来设置每个属性?据我所知,反射可以给你的名字,但不是属性本身,这是我所需要的。类似于
myClassElement.PROP=lineSplit[index]其中索引从零循环到n,“PROP”从属性1循环到属性n。这将是我的理想解决方案。有这样的事情吗?@ptuga:除了可能有更好的解决方案之外,我不知道你为什么不应该使用反射,不。记录在案,在某些情况下,有一些方法可以使反射更快:@ptuga:属性的设置者,即。但是,如果只对每个属性设置一次,则不会产生任何影响。虽然像答案建议的那样,你可以尝试其他方法来代替反射。我当然想使用一个类。