我正在尝试使用AddRange方法填充自定义类的列表。
这是自定义类:
public class Hook
{
public Hook(System.Data.DataRow values)
{
this.text = values[0].ToString();
this.category = values[1].ToString();
this.weather = values[2].ToString();
this.timeofday = values[3].ToString();
}
public string text { get; set; }
public string category { get; set; }
public string[] associatedLandmarks { get; set; }
public string weather { get; set; }
public string timeofday { get; set; }
}
这是我需要过滤对象的对象数组,我使用数据表中的值填充它:
int numberofhooks = result.Tables[1].Rows.Count - 1;
Hook[] Hooks = new Hook[numberofhooks];
for (int i = 0; i < numberofhooks; i++)
{
Hooks[i] = new Hook(result.Tables[1].Rows[i]);
}
我需要使用动态更新的变量过滤掉这些对象的子集,这是该类的属性。
'category'是属性
我使用AddRange方法执行此操作,但它无法正常工作。这可能是什么问题?或者还有另一种方法可以实现这一目标吗?
List<Hook> RelevantHooks = new List<Hook>();
foreach (string category in relevantHookCategories)
{
RelevantHooks.AddRange(from item in Hooks
where item.category == category
select item);
}
由于
答案 0 :(得分:1)
我在这里看到两个问题:
如果你想要你桌子上的所有行,你为什么要使用:
int numberofhooks = result.Tables [1] .Rows.Count - 1;
应该是:
int numberOfHooks = result.Tables[1].Rows.Count;
您排除的最后一项可能包含您要查找的类别。
当你说&#34;在飞行中&#34;我假设您希望在查询后更新子集RelevantHooks
,在修改Hooks
时,如果是这样,则您不必使用列表,只需将您的相关挂钩定义为:
IEnumerable<Hook> relevantHooks = Hooks.Where(h => relevantHookCategories.Contains(h.category));
e.g。如果您修改任何Hooks
项的类别属性:
Hooks[0].category="Other Category Value";
将排除或包含来自relatedHooks的第一个钩子
答案 1 :(得分:0)
RelevantHooks.AddRange(Hooks.Where(hook => category == hook.category));
应该足够了。在这种情况下,您不一定需要select子句。
答案 2 :(得分:0)
无需使用AddRange。只需迭代Hooks一次,检查它是否属于其中一个类别。
RelevantHooks = Hooks.Where(h => relevantHookCategories.Contains(h.category)).ToList();
答案 3 :(得分:0)
试试这个:
RelevantHooks.AddRange((from item in Hooks
where item.category == category
select item).ToArray());
我认为这不重要,但可能是AddRange方法失败了,因为当它期待IEnumerable时它被传递了IQueryable
鉴于我上次的评论,这就是我的意思:
for (int i = 0; i < numberofhooks; i++)
{
Hooks[i] = new Hook(result.Tables[1].Rows[i]);
if(relevantHookCategories.Contains(Hooks[i].category)
RelevantHooks.Add(Hook[i]);
}