我有一个列表/数组,需要处理某些元素,但还需要处理中元素的索引。 示例:
List Names = john, mary, john, bob, simon Names.Where(s => s != "mary").Foreach(MyObject.setInfo(s.index, "blah")
但是不能将“index”属性与列表一起使用,反之如果名称在数组中我不能使用Foreach ... 有什么建议吗?
答案 0 :(得分:7)
你应该使用一个简单的for
循环,如下所示:
var someNames = Names.Where(s => s != "mary").ToArray();
for (int i = 0; i < someNames.Length; i++)
someNames.setInfo(i, "blah");
LINQ不是基本循环的全部和全部。
如果确实想要使用LINQ,则需要致电Select
:
Names.Where(s => s != "mary").Select((s, i) => new { Index = i, Name = s })
答案 1 :(得分:2)
是的,没有使用循环的方法。
您只需要.ToList()
.Where()
条款
Names.Where(s => s != "mary").ToList().Foreach(MyObject.setInfo(s.index, "blah");
答案 2 :(得分:1)
Foreach对集合中的每个元素执行操作。 参考:https://msdn.microsoft.com/en-us/library/bwabdf9z(v=vs.110).aspx
以下是您案例的示例代码
public static void printItem(int index, string name){
Console.WriteLine("Index = {0}, Name is {1}",index,name);
}
printItem方法
// Wrapper.h
#pragma once
// API for call by C
#ifdef __cplusplus
extern "C" {
#endif
void* wrap_create();
void wrap_doit(void* wrapper, char* input, char* output, int maxlen);
#ifdef __cplusplus
}
#endif
// Wrapper.cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <vcclr.h>
#include "Wrapper.h"
using namespace System;
class Wrapper {
public:
gcroot<Wrappee::Evaluator^> eval;
Wrapper() {}
};
void* wrap_create() {
Wrapper* w = new Wrapper();
w->eval = gcnew Wrappee::Evaluator();
return w;
}
void wrap_doit(void* wrapper, char* input, char* output, int maxlen) {
Wrapper* w = (Wrapper*)wrapper;
String^ s = w->eval->Doit(gcnew String(input));
pin_ptr<const wchar_t> wch = PtrToStringChars(s);
wcstombs(output, wch, maxlen);
}
// Wrappee.cs
using System;
namespace Wrappee {
public class Evaluator {
string _s;
public static Evaluator Create() {
return new Evaluator {
_s = "wrapped evaluator"
};
}
public string Doit(string s) {
return _s + ":" + s;
}
}
}
输出:
索引= 0,名称为约翰
索引= 1,名字是约翰
索引= 2,名称为bob
索引= 3,名字是西蒙