Ответ 1
Вы можете использовать метод Intersect
:
var c = a.Intersect(b);
Это возвращает все значения как в a, так и в b. Однако позиция элемента в списке не принимается во внимание.
У меня есть список int A, B. Мне нравится делать следующий шаг в linq
list<int> c = new List<int>();
for (int i = 0; i < a.count; i++)
{
for (int j = 0; j < b.count; j++)
{
if (a[i] == b[j])
{
c.add(a[i]);
}
}
}
если его a и b являются object
, мне нужно проверить определенные свойства, подобные этому, и добавить список, если он равен тому, как я могу это сделать в linq?
Вы можете использовать метод Intersect
:
var c = a.Intersect(b);
Это возвращает все значения как в a, так и в b. Однако позиция элемента в списке не принимается во внимание.
Вы можете использовать Intersect:
var a = new List<int>();
var b = new List<int>();
var c = a.Intersect(b);
В LINQ эквивалент вашего кода:
var c = from i in Enumerable.Range(0, a.Count)
from j in Enumerable.Range(0, b.Count)
where a[i] == b[j]
select a[i];
var cList = c.ToList();
Но это гораздо приятнее сделать:
var c = from aItem in a
join bItem in b on aItem equals bItem
select aItem;
var cList = c.ToList();
Но это не фильтрует дубликаты. Чтобы полностью фильтровать дубликаты, вы можете:
var cList = a.Intersect(b).ToList();
Если вы хотите, чтобы дубликаты отображались столько раз, сколько в b
, например:
var aSet = new HashSet<int>(a);
var cList = b.Where(aSet.Contains)
.ToList();
Создайте список c
, содержащий все элементы, которые присутствуют в обоих списках a
и b
:
List<int> c = a.Intersect(b).ToList();
Как замечает Крис в своем комментарии к исходному вопросу, представленный пример кода будет возвращать дубликаты в списке c (подробности см. в его комментарии). Пересечение будет возвращать только отдельные значения. Чтобы дублировать поведение исходного кода примера, попробуйте следующее:
var c = (from value in a
where b.Contains(a)
select a);
Используйте этот код.... Это определенно поможет вам...
class CompareLists
{
static void Main()
{
// Create the IEnumerable data sources.
string[] names1 = System.IO.File.ReadAllLines(@"../../../names1.txt");
string[] names2 = System.IO.File.ReadAllLines(@"../../../names2.txt");
// Create the query. Note that method syntax must be used here.
IEnumerable<string> differenceQuery =
names1.Except(names2);
// Execute the query.
Console.WriteLine("The following lines are in names1.txt but not names2.txt");
foreach (string s in differenceQuery)
Console.WriteLine(s);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
/* Output:
The following lines are in names1.txt but not names2.txt
Potra, Cristina
Noriega, Fabricio
Aw, Kam Foo
Toyoshima, Tim
Guy, Wey Yuan
Garcia, Debra
*/