2016-04-13 11 views
0

Ich habe eine Textdatei, die Produktinformationen in jeder Zeile, in der Form von „product, Produktnamen, amountInStock, etc ..“ enthältKann ich ein Array von Strings in ein Array von Substring-Arrays umwandeln?

I File.ReadAllLines verwendet habe in einem Array jede Zeile als ein Element zu speichern, und jetzt verwende ich diese Zeichenfolgen, um Werte einer Liste von Produktstrukturen zuzuordnen.

Hier wird der Code verwendet wird, diese Zeichenfolgen aus dem Array in Teil aufzuspalten:

foreach (String line in readProducts) 
{ 
    productData = line.Split(','); 
    readProducts[foreachCount] = productData; 
    foreachCount++; 
} 

Was mich diesen Fehler in Visual Studio gibt:

Cannot implicitly convert type 'string[]' to 'string' 

Was ist der beste Weg wäre, Beende diese Aufgabe unter der Annahme, dass ich Strukturen anstelle von Klassen verwenden muss?

+0

Die readProducts [foreachCount] gibt Ihnen string als readProducts würde Array von Strings sein, während ProductData Array von Strings ist. Array von Zeichenfolgen konnte der Zeichenfolge nicht zugewiesen werden. Dies ist, was die Fehlermeldung sagt. – Adil

+0

Warum müssen Sie Strukturen anstelle von Klassen verwenden? –

+0

Der Code ist Teil eines Assessments, das Strukturen spezifiziert. Obwohl ich nicht glaube, dass ich tatsächlich Strukturen verwenden muss, kann der Dozent nicht fragen, und ich möchte lieber nicht riskieren, sie zu ändern. –

Antwort

0

Verwenden Sie diese Art und Weise

List<string[]> readProducts = new List<string[]>(); 
foreach (String line in readProducts) 
     { 
      productData = line.Split(','); 
      readProducts.Add(productData); 
     } 
+1

Dies ist eine wirklich ausführliche Form von 'readProducts.Select (x => x.Split (',')). ToList()'. –

+0

Das Problem damit ist, wenn readProducts jetzt eine Liste von String-Arrays ist, enthält es nicht mehr die Zeilen aus der Textdatei, so dass ich die Zeilen daraus nicht lesen kann. –

+0

dann können Sie gezackten Array versuchen https://msdn.microsoft.com/en-us/library/2s05feca.aspx – Mostafiz

0

Hier ist eine bessere Option für Sie:

Lassen product die Klasse, enthält Eigenschaften wie productCode, productName,amountInStock,etc.., wie Sie in der Frage erwähnt. Sie können eine Liste von product erstellen und direkt die Eingangswerte in die Liste zuweisen wie folgt aus:

string path="path here" 
List<product> ProductList = new List<product>(); 
foreach (string line in File.ReadAllLines(path)) 
{ 
    string[] productDetails = line.Split(','); 
    ProductList.Add(new product() { productCode = productDetails[0], productName = productDetails[1] }); 
} 

Wo die Produktklasse wie folgt aussieht: kann

public class product 
{ 
    public string productCode { get; set; } 
    public string productName { get; set; } 
    // rest of properties 
} 
0

Sie Select auf ein projizieren verwenden neue Kollektion:

var allItems = readProducts.Select(line => line.Split(',')); // collection of string arrays 

oder auf eine neue Art zu projizieren:

var allProducts = readProducts.Select(line => line.Split(',')) // collection of string arrays 
           .Select(array => new Product { 
               productCode = array[0], 
               productName = array[1], 
               amountInStock = array[2], 
                // etc. 
               }); // collection of Products 
+0

I ' Ich bin mir ziemlich sicher, dass ich verstehe, wie Ihr erstes Beispiel funktioniert, obwohl ich nicht für mein Leben herausfinden kann, warum Select Select genannt wird, anstatt etwas genaueres wie DoToEach. Ihr zweites Beispiel aber bekomme ich nicht, können Sie es mir bitte erklären? –

+0

@SpaceOstrich: Es heißt Select, weil es häufig verwendet wird, um eine Eigenschaft aus einem Element auszuwählen. 'customers.Select (c => c.Address)' wandelt eine Kundensequenz in eine Folge von Adressen um; es ** wählt ** die Adresse von jedem Kunden aus. Diese Operation wird in anderen Sprachen allgemein als map bezeichnet, was eine noch dunklere Analogie ist. (Dass die Beziehung zwischen dem ausgewählten Ding und dem ausgewählten Ding analog zu der Beziehung zwischen einer Figur auf einer Karte und der entsprechenden Figur im wirklichen Leben ist.) –

+0

Ich habe mich daran gewöhnt und bin nah dran die Antwort zu haben, habe ich immer noch nicht ganz den Dreh raus. In D Stanleys Beispielen verwendet er "Linie". Was genau ist Linie in diesem Zusammenhang? Eine lokale Variable? Was ist ihm zugeteilt? –

0

Mit System und gezackten Arrays konnte ich das Problem lösen. Hier ist der Code, der im Arbeitsprogramm verwendet wird.

int i = 0; 
String[][] allProducts = new String[readProducts.Length][]; 
var parsedProduct = readProducts.Select(item => item.Split(',')); 
foreach (var item in parsedProduct) 
    { 
     allProducts[i] = item; 
     i++; 
    } 

allProducts[][] ist ein gezacktes Array. Ansonsten bekannt als Array of Arrays.

parsedProduct ähnelt dem gezackten Array, jedes Element enthält ein anderes Array mit den Teilstrings, die aus der aktuellen Zeile readProduct als Elemente extrahiert wurden.

allProducts 's Elemente werden den Inhalt von parsedProducts' s Elemente durch die foreach Schleife zugeordnet.

Soweit ich sagen kann, gibt es keine Möglichkeit, den mittleren Mann zu schneiden und einfach Select() auf readProducts direkt zu verwenden. Aber ich könnte falsch liegen.

+0

Denken Sie nicht über 'LINQ'-Lösung nach? – Ian

Verwandte Themen