检查列表<t>是否包含任何其他列表

gdp*_*gdp 72 c# loops list subset c#-4.0

我有一个像这样的参数列表:

public class parameter
{
    public string name {get; set;}
    public string paramtype {get; set;}
    public string source {get; set;}
}

IEnumerable<Parameter> parameters;
Run Code Online (Sandbox Code Playgroud)

我想要检查它的一系列字符串.

string[] myStrings = new string[] { "one", "two"};
Run Code Online (Sandbox Code Playgroud)

我想迭代参数列表并检查source属性是否等于任何myStrings数组.我可以用嵌套的foreach来做到这一点,但我想学习如何以更好的方式做到这一点,因为我一直在玩linq,就像可枚举的扩展方法一样,所以嵌套的foreachs只是感觉不对.有没有更优雅的首选linq/lambda/delegete方法来做到这一点.

谢谢

Bro*_*ass 156

您可以使用嵌套Any()进行此检查,该检查可用于任何Enumerable:

bool hasMatch = myStrings.Any(x => parameters.Any(y => y.source == x));
Run Code Online (Sandbox Code Playgroud)

更快的执行上较大的集合将投射parameterssource,然后用Intersect它在内部使用HashSet<T>所以不是为O(n ^ 2)对于第一种方法(双嵌套循环的等价物),你可以做检查的O(N):

bool hasMatch = parameters.Select(x => x.source)
                          .Intersect(myStrings)
                          .Any(); 
Run Code Online (Sandbox Code Playgroud)

另外,作为附注,您应该将您的类名和属性名称大写以符合C#样式指南.

  • 在性能方面,`parameters.Any(x =&gt; myStrings.Contains(x.source));` 不会比你的第一个例子更好吗? (2认同)

Mas*_*ian 7

这是一个示例,用于查找另一个列表中是否有匹配元素

List<int> nums1 = new List<int> { 2, 4, 6, 8, 10 };
List<int> nums2 = new List<int> { 1, 3, 6, 9, 12};

if (nums1.Any(x => nums2.Any(y => y == x)))
{
    Console.WriteLine("There are equal elements");
}
else
{
    Console.WriteLine("No Match Found!");
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果涉及的列表很大,这最终会比 `Intersect` 方法慢很多,因为它的列表大小是 O(N*M)。(虽然它在内存中是 O(1)。) (2认同)

小智 6

如果两个列表都太大并且当我们使用 lamda 表达式时,那么将需要很长时间来获取。在这种情况下最好使用 linq 来获取参数列表:

var items = (from x in parameters
                join y in myStrings on x.Source equals y
                select x)
            .ToList();
Run Code Online (Sandbox Code Playgroud)


M K*_*aei 6

  1. 两个对象列表:

    list1.Select(l1 => l1.Id).Intersect(list2.Select(l2 => l2.Id)).ToList();

  2. 两个对象列表:

var list1 = wait _service1.GetAll();

var list2 = wait _service2.GetAll();

// Create a list of Ids from list1
var list1_Ids = list1.Select(l => l.Id).ToList();

// filter list2 according to list1 Ids
var list2 = list2.Where(l => list1_Ids.Contains(l.Id)).ToList();
Run Code Online (Sandbox Code Playgroud)
  1. 两个 Guid 或 int 列表:

    列表1.Any(l1 => 列表2.Any(l2 => l2 == l1))

  2. 如果 list1 的项目多于 list2 并且我们想要找到它们:

    var 结果 = ListOfGuids1.Except(ListOfGuids1).ToList();