假设我有两个列表 List<NewTile>
和 List<OldTile>
. List<OldTile>
总是包含比 List<NewTile>
更多的项目.
public class NewTile
{
public Uri Navigation { get; set; }
public string Info { get; set; }
}
public class OldTile
{
public String Scheme { get; set; }
public string Status { get; set; }
}
Navigation
属性始终包含 Scheme
例如字符串。这就是项目在这两个列表之间的关联方式。
Scheme = "wikipedia"
Navigation = "/Pages/BlankPage.xaml?Scheme=wikipedia"
我想从 List<NewTile>
中获取所有项目他们的导航属性与其中任何一个都不匹配 Scheme
来自 List<OldTile>
的字符串.我如何使用 LINQ 执行此操作?
最佳答案
您可以使用 Where
+ Any
和 HttpUtility.ParseQueryString
检查查询字符串是否与 链接方案
:
var newNotInOld = newTiles
.Where(nt => !oldTiles
.Any(ot => ot.Scheme.Equals(HttpUtility.ParseQueryString(nt.Navigation.ToString())["Scheme"], StringComparison.InvariantCultureIgnoreCase)));
您需要添加using System.Linq
和using System.Web
。
由于您使用的是 Windows Phone,因此您没有 HttpUtility.ParseQueryString
。所以可以尝试这种方法:http://dotnetautor.de/blog/2012/06/25/WindowsPhoneParseQueryString.aspx
除此之外,您还可以使用字符串方法或正则表达式。例如:
var newNotInOld = newTiles
.Where(nt => !oldTiles
.Any(ot => {
string url = nt.Navigation.ToString();
int index = url.IndexOf('?');
bool containsScheme = false;
if (index >= 0)
{
string queryString = url.Substring(++index);
containsScheme = queryString.Split('&')
.Any(p => p.Split('=')[0].Equals("Scheme", StringComparison.InvariantCulture)
&& p.Split('=').Last().Equals(ot.Scheme, StringComparison.InvariantCultureIgnoreCase));
}
return containsScheme;
}));
关于c# - LINQ:根据属性比较两个列表并返回符合特定条件的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23605384/