我有两个List<int>
,例如:
L1 = (new int[]{1,1,1,2,2,2,1,1,1}).ToList();
L2 = (new int[]{a,b,c,d,e,f,g,h,i}).ToList();
现在,如果我要删除a,b,c,g,h,i;因为他们在L1上的记者是1,那LINQ应该是什么?
我可以在L1中获取索引:
var L1IDX = L1.Select((it, id) => new { itm = it, idx = id })
.Where(l => l.itm == 1)
.Select(l => l.idx);
但那又怎么样?我无法找到一个带有索引列表的Remove...()
。
答案 0 :(得分:4)
没有带有索引列表的重载,但是有一种方法可用于单个索引RemoveAt
。你需要在循环中调用它:
foreach(var index in L1IDX.OrderByDescending(x=>x))
L2.RemoveAt(index);
如果您发现自己想要经常按索引删除多个项目,您可能会发现使用扩展方法从列表中删除所有一系列的内容是值得的;它基本上看起来就像上面一样,包含在一个方法中:
public static void RemoveAllAt<T>(this IList<T> list,
IEnumerable<int> indecies)
{
foreach (var index in indecies.OrderByDescending(x => x))
list.RemoveAt(index);
}
答案 1 :(得分:2)
首先,您无法使用LINQ修改列表。您可以使用所需的值创建新列表。
var query = L1.Zip(L2, (f, s) => new {F = f, S = s})
.Where(f => f.F != 1).Select(r => r.S);
答案 2 :(得分:2)
List<int> L1 = new List<int>() {1,1,1,2,2,2,1,1,1};
List<char> L2 = new List<char>() {'a','b','c','d','e','f','g','h','i'};
var result = L1.Zip(L2, (i, c) => new
{
I = i,
C = c
})
.Where(x => x.I != 1)
.Select(x => x.C)
.ToList();
答案 3 :(得分:0)
试试这个 -
使用此功能,您不必完全创建新序列。
var L1 = (new int[] { 1, 1, 1, 2, 2, 2, 1, 1, 1 }).ToList();
var L2 = (new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' }).ToList();
int index = 0;
L2.RemoveAll(delegate(char c) {
bool IsRemove = false;
if (L1[index] == 1)
{
IsRemove = true;
}
else
{
IsRemove = false;
}
index++;
return IsRemove;
});