2014-01-30 4 views
-2

привет я хочу создать Еогеасп с 2 заявления, как этотЕогеасп с 2 Заявление

foreach (CSheet mySheet in mySheets && CSheet nameQuiz in nameQuizs) { 
    //problem if i just used one statement in foreach i can't give property 'name' to 
      nameQuiz...so it's limited like this 
    oSheet = mySheet.name.toString(); 

    //i wanna make nameQuiz have property name too like mysheet 
    oSheet = mySheet.name.toString(); 
    oName = nameQuiz.name.toString(); 
} 

это мой CSheets

public class CSheet 
{ 
    public string name; 
    public CCell[] cells; 
} 

mysheets & nameQuizs является массив
любая идея?


артур

public static string exportToExcel(string fileName, CSheet[] mySheets, CSheet[] nameQuizs) 

на основе того, что код mySheets & nameQUizs связанных или нет? как я могу знать, связаны ли они?

+2

Можете ли вы объяснить, что будет делать ваш цикл, шаг за шагом. –

+0

@katik На вашем «artur» редактировании: Erm ... если * вы * не знаете, как 'mySheets' и' nameQuizs' связаны каким-то образом, кто будет знать? * Ты * тот, кто пишет код, так что ты намерен? Связаны ли они каким-то образом? Почему вы хотите зацикливать их обоих одновременно? Какова логика вашего кода? –

+0

На самом деле этот проект не я создаю с нуля ... я просто исправлю любую ошибку, поэтому я не очень хорошо понимаю почти часть этого кода, и это первый проект C#, с которым я обращаюсь, поэтому я все еще участвую ... для вашего второго вопрос, потому что, если я создаю другой цикл ... результат действительно отличается от того, я хочу – Neversaysblack

ответ

3

Вы не можете этого сделать. Вы можете сделать это с одной for петли, однако:

for (int i = 0; i < Math.Min(mySheets.Count, nameQuizs.Count); i++) 
{ 
    CSheet mySheet = i < mySheets.Count ? mySheets[i] : null; 
    CSheet nameQuiz = i < nameQuizs.Count ? nameQuizs[i] : null; 

    oSheet = mySheet != null ? mySheet.name : String.Empty; 
    oName = nameQuiz != null ? nameQuiz.name : String.Empty; 
} 

В СЭУА ваши mySheets и nameQuizs списки фактически являются массивами, вам нужно заменить Count на Length.

Также у вас нет name.ToString();, так как член name - это уже String.

+0

Теоретически '' mySheets'' или 'nameQuizs' может быть любым' IEnumerable', 'Count' (или' Length') может быть затруднительным. – Corak

+0

Это, с одной стороны, правда, с другой стороны, давайте просто надеемся на лучшее :-) Я просто делал предложение. –

+0

Я получил ошибку Ошибка 'Operator' <'не может быть применена к операндам типа' int 'и' group метода '' – Neversaysblack

4

Вы можете zip две последовательности (т.е. принимают соответствующие элементы из обеих последовательностей):

foreach (var item in mySheets.Zip(nameQuizs, (s,nq) => new { mySheet = s, nameQuiz = nq })) 
{ 
    oSheet = item.mySheet.name;  
    oSheet = item.mySheet.name; 
    oName = item.nameQuiz.name;  
} 

UPDATE: Таким образом, вы используете .NET 3.5 Zip расширение не доступно. Но вы можете написать свой собственный:

public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(
    this IEnumerable<TFirst> firstSource, 
    IEnumerable<TSecond> secondSource, 
    Func<TFirst, TSecond, TResult> selector) 
{ 
    using(var firstIterator = firstSource.GetEnumerator()) 
    using(var secondIterator = secondSource.GetEnumerator()) 
    { 
     while(firstIterator.MoveNext() && secondIterator.MoveNext()) 
      yield return selector(firstIterator.Current, secondIterator.Current); 
    } 
} 
+2

+1 Черт, опять слишком поздно. –

+0

Я получил ошибку 'systemArray не содержит определения для zip' sory забыть написать mySheets & nameQuizs - это массив до – Neversaysblack

+0

@katik добавить пространство имен System.Linq, используя в ваш файл кода. Zip - это метод расширения, определенный в этом пространстве имен –

1

Если вы хотите проходной в то время как элементы существуют как от использования этого:

var mySheetsEnum = mySheets.GetEnumerator(); 
var nameQuizsEnum = nameQuizs .GetEnumerator(); 

while(mySheetsEnum.MoveNext() && nameQuizsEnum.MoveNext()) 
{ 
    ... 
} 

еще вы можете использовать || вместо &&.

+0

Кстати, это именно то, что происходит в ZipIterator :) Также его лучше обернуть перечисления в использование операторов –

+0

@SergeyBerezovskiy Полностью согласен. –

1

Вы можете получить это в одну петлю довольно элегантно, используя Zip extension method:

foreach (var item in mySheets.Zip(nameQuizs, (s, q) => Tuple.Create(s, q))) 
{ 
    var mySheet = item.Item1; 
    var nameQuiz = item.Item2; 
} 

Вместо Tuple, анонимный тип, возможно, является лучшим решением. См. Sergey's answer.

В основном это то, что он выполняет итерации последовательностей и zip-объединяет следующий элемент каждой коллекции друг с другом. Как правило, вы каким-то образом их объединяете или копируете в Tuple или любой пользовательский объект.

Несмотря на то, что метафора не подходит идеально, вы можете подумать о слиянии двух автомагистралей с одной, в которой применяется концепция zip-merge. Однако здесь мы получаем пары автомобилей вместо одной длинной линии.

+0

Являются ли свойства из кортежа более элегантными, чем названные свойства от анонимного типа? –

+1

@ Сергий Березовский Нет, я думаю, ваше решение лучше. Видел ваш ответ сразу после того, как я разместил свой. –

+0

OK :) Это моя личная неприязнь к кортежам в C# –

2

Если mySheets и nameQuizs связаны друг с другом, вы можете поместить их в словарь, Dictionary<CSheet, CSheet> и перечислите его.

Альтернативно используйте цикл for и индекс каждого элемента.

+0

, пожалуйста, отредактируйте отредактированный пост – Neversaysblack

Смежные вопросы