LINQ:选择对象不包含列表中的项目的位置

far*_*ina 73 c# linq

我在这里努力学习LINQ语法...以为我会把它丢在这里.我无法找到我正在寻找的其他地方.

好吧,说我有这个:

public class Bar
{
   public int BarId { get; set; }
}

public class Foo
{
   public List<Bar> BarList { get; set; }
}

List<Foo> fooBunch = GetABunchOfFoos(); //let's just assume I'm getting more than one
List<Foo> fooSelect = new List<Foo>;
List<Bar> filterBars = GetAFewBars(); //assume I'm getting like 2 or 3

fooSelect = (from f in fooBunch
             where !(from b in f.BarList select b.BarId).Contains(ITEM FROM filterBars.BarId)
             select f).ToList();
Run Code Online (Sandbox Code Playgroud)

所以,长话短说我想使用LINQ根据另一个列表中的对象过滤掉我的对象列表.我希望这是有道理的.我想我只是迷失在Contains部分......我不知道怎么写.

The*_*eze 118

一般来说,您正在寻找"除外"扩展名.

var rejectStatus = GenerateRejectStatuses();
var fullList = GenerateFullList();
var rejectList = fullList.Where(i => rejectStatus.Contains(i.Status));
var filteredList = fullList.Except(rejectList);
Run Code Online (Sandbox Code Playgroud)

在此示例中,GenerateRegectStatuses()应该是您要拒绝的状态列表(或者根据您的示例更具体的术语List<int>,ID)

  • 我怎么会在一行中做到这一点?我明白这可能是不可能的. (2认同)

hun*_*ter 69

将此转储到您不想要的ID的更具体的集合中

var notTheseBarIds = filterBars.Select(fb => fb.BarId);
Run Code Online (Sandbox Code Playgroud)

试试这个:

fooSelect = (from f in fooBunch
             where !notTheseBarIds.Contains(f.BarId)
             select f).ToList();
Run Code Online (Sandbox Code Playgroud)

或这个:

fooSelect = fooBunch.Where(f => !notTheseBarIds.Contains(f.BarId)).ToList();
Run Code Online (Sandbox Code Playgroud)


Ton*_*ion 5

我没有尝试过,所以我没有任何保证

foreach Bar f in filterBars
{
     search(f)
}
Foo search(Bar b)
{
    fooSelect = (from f in fooBunch
                 where !(from b in f.BarList select b.BarId).Contains(b.ID)
                 select f).ToList();

    return fooSelect;
}
Run Code Online (Sandbox Code Playgroud)

  • 据我所知,b.ID无法编译。Contains方法似乎使b的上下文松散。 (2认同)
  • 您正在使用两个名为`b`的变量,编译器可能会发现它不明确。 (2认同)

ale*_*lex 5

试试这个简单的 LINQ:

//For a file list/array
var files = Directory.GetFiles(folderPath, "*.*", SearchOption.AllDirectories);

//simply use Where ! x.Contains
var notContain = files.Where(x => ! x.Contains(@"\$RECYCLE.BIN\")).ToList();

//Or use Except()
var containing = files.Where(x => x.Contains(@"\$RECYCLE.BIN\")).ToList();
    notContain = files.Except(containing).ToList();
Run Code Online (Sandbox Code Playgroud)