在C#中使用linq添加范围到列表

时间:2015-06-11 18:23:57

标签: c# linq list

我正在尝试使用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);
        }

由于

4 个答案:

答案 0 :(得分:1)

我在这里看到两个问题:

  1. 如果你想要你桌子上的所有行,你为什么要使用:

      

    int numberofhooks = result.Tables [1] .Rows.Count - 1;

    应该是:

    int numberOfHooks = result.Tables[1].Rows.Count;
    

    您排除的最后一项可能包含您要查找的类别。

    1. 当你说&#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]);
}